错误:无法强制进入Fixnum

时间:2014-06-05 13:38:21

标签: ruby-on-rails model fixnum

首先,这个问题与我以前的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永远不应该是空白的,但是如果我正在对它进行测试的话。

3 个答案:

答案 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是否为零来处理它。