RSpec Shoulda validates_presence_of nilClass

时间:2013-05-08 05:28:16

标签: ruby-on-rails validation testing rspec shoulda

当我使用Shoulda的validates_presence_of时,它偶然发现了before_validation回调。

before_validation   :set_document, :set_product, :set_price

我正试图通过这个规范:

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

对于订单项的数量,unit_price,tax_rate和price,我的数据库默认值为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

我很感激任何帮助,因为我完全难过。我确实看到一些人发布了自定义验证方法。这看起来很基本,我无法弄清楚如何继续。

1 个答案:

答案 0 :(得分:0)

由于total_price在验证之前运行,因此在执行回调时quantity可以是nil。这实际上是在Shoulda匹配器运行时幕后发生的事情,这就是你得到错误的原因。它正在尝试将*方法发送到quantity nil

改为使用after_validationbefore_save