2013-05-08 31 views
0

当我使用Shoulda的validates_presence_of时,它在一个before_validation回调函数上失败。RSpec Shoulda validates_presence_of nilClass

before_validation :set_document, :set_product, :set_price 

我试图让这个规范来传递:

it { should validate_presence_of(:quantity).with_message("Please a quantity.") } 

我有一个行项目的数量,UNIT_PRICE,TAX_RATE和价格的0数据库的默认值。在订单项验证之前,我会根据其他属性计算价格发生变化时的价格。

我得到这个错误,而类似的错误,对所有参与这个计算的属性:

3) LineItem 
    Failure/Error: it { should validate_presence_of(:quantity).with_message("Please a quantity.") } 
    NoMethodError: 
    undefined method `*' for nil:NilClass 
    # ./app/models/line_item.rb:153:in `total_price' 
    # ./app/models/line_item.rb:223:in `set_price' 
    # ./spec/models/line_item_spec.rb:32:in `block (2 levels) in <top (required)>' 

我的回调,set_price,是非常简单的:

def set_price 
    self.price = total_price 
end 

而且TOTAL_PRICE方法也很简单:

def total_price 
    quantity * unit_price * (1 + tax_rate/100) 
end 

我很感激任何帮助,因为我'米完全难倒了。我确实看到一些人发布关于自定义验证方法的信息这似乎很基础,我不知道如何继续。

+0

什么是'unit_price'?这可能是'nil' – ck3g 2013-05-08 07:55:19

+1

unit_price的数据库默认值为0,税率,数量和价格也一样。 – 2013-05-08 08:42:05

+0

因此,尝试将这两个字段的日志值设为'nil'。和/或尝试使用'self.quantity'和'self.unit_price' – ck3g 2013-05-08 09:33:22

回答

0

由于total_price运行之前验证,quantity可以nil在执行回调的时间。这实际上是Shoulda匹配器运行时幕后发生的情况,这就是为什么你会得到一个错误。它试图将*方法发送到quantity,即nil

改为使用after_validationbefore_save

相关问题