0

首先,这个问题与我之前的问题有点相似,但我觉得不同之处足以让我开始一个新的线程。当我尝试在我的模型上测试验证时,就会出现问题。我有一个用户模型,它必须需要字段: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只是一个 monteized 版本default_price,而 default_packs 是我模型中的另一个字段。问题源于这样一个事实,当 default_price_cents 为空白时,这两个不能相乘,但是如何在我的测试中解决这个问题?由于我的验证,default_price_cents 永远不应为空,但如果我正在测试它。

4

3 回答 3

0

这个问题的原因是整数与 nil 的任何算术运算,例如。

1 + nil
1 * nil

您可以通过仅检查第二个 arg 是否为 nil 来处理它。

于 2014-12-05T18:19:35.110 回答
0

从您的代码中,您将用户对象参数传递给 User.new。我认为你应该使用

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

请尝试一下。

于 2014-06-05T13:49:29.373 回答
0

我通过简单地确保对新模型定义的验证来解决这个问题,使用:

  def daily_saving_potential_cents
    unless default_price_cents.nil? && default_packs.nil?
      return default_price_cents * default_packs
    end
  end
于 2014-06-05T14:00:56.470 回答