ОШИБКА: ноль не может быть принудительно введен в Fixnum

Прежде всего, этот вопрос немного похож на мой предыдущий вопрос, но я чувствовал, что он достаточно отличается, чтобы начать новую тему. Проблема возникает, когда я пытаюсь проверить валидацию на моей модели. У меня есть модель пользователя, которая должна требовать поле:default_price. Мой тест выглядит следующим образом:

it "should require default packs" do
  User.new(FactoryGirl.build(:user, :default_packs => " ")).should_not be_valid
end

Однако, когда я запускаю тест, я получаю следующую ошибку:

 Failure/Error: should_not be_valid
 TypeError:
   nil can't be coerced into Fixnum
 # ./app/models/user.rb:62:in `*'
 # ./app/models/user.rb:62:in `daily_saving_potential_cents'
 # ./spec/models/user_spec.rb:155:in `block (2 levels) in <top (required)>'

Daily_saving_potential_cents определяется следующим образом:

  def daily_saving_potential_cents
    return default_price_cents * default_packs
  end

default_price_cents это просто монетизированная версия default_priceи default_packs - это еще одно поле в моей модели. Проблема связана с тем, что эти два не могут быть умножены вместе, когда default_price_cents пусто, но как мне это исправить в моих тестах? Из-за моей проверки default_price_cents никогда не должен быть пустым, но это если я проверяю это.

3 ответа

Причиной этой проблемы является любая арифметическая операция целого числа с нулем, например.

1 + ноль
1 * ноль
и т.п.

Вы можете справиться с этим, только проверив, равен ли второй аргумент нулю или нет.

Из вашего кода вы передаете параметр объекта пользователя в User.new. Я думаю, что вы должны использовать

User.new(FactoryGirl.attributes_for(:user, :default_packs => " "))

Пожалуйста, попробуйте это.

Я решил это, просто проверив валидации новых определений модели, используя:

  def daily_saving_potential_cents
    unless default_price_cents.nil? && default_packs.nil?
      return default_price_cents * default_packs
    end
  end
Другие вопросы по тегам