首先,这个问题与我以前的question略有相似,但我觉得与我开始一个新线程有很大不同。当我尝试在我的模型上测试验证时出现问题。我有一个必须要求字段的用户模型: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
的monteized版本,而default_packs是我模型中的另一个字段。问题源于这样的事实:当default_price_cents为空时,这两者不能相乘,但如何在我的测试中解决这个问题呢?由于我的验证,default_price_cents永远不应该是空白的,但是如果我正在对它进行测试的话。
答案 0 :(得分:0)
从您的代码中,您将用户对象参数传递给User.new。我认为你应该使用
User.new(FactoryGirl.attributes_for(:user, :default_packs => " "))
请试试。
答案 1 :(得分:0)
我通过简单地确保新模型定义的验证来解决这个问题,使用:
def daily_saving_potential_cents
unless default_price_cents.nil? && default_packs.nil?
return default_price_cents * default_packs
end
end
答案 2 :(得分:0)
这个问题的原因是任何带有nil的整数的算术运算,例如
1 + nil
1 * nil
等
您可以通过仅检查第二个arg是否为零来处理它。