FactoryGirl - 调用def_delegators时的NoMethodError

时间:2017-09-08 17:10:42

标签: ruby-on-rails ruby rspec factory-bot rspec-rails

我正在使用FactoryGirl和Rspec在rails上进行测试,当我使用使用def_delegators定义的方法时,我遇到了一个问题。

例如这个测试:

it 'has the weekly discount' do
  //I also tried using create here
  menu = FactoryGirl.build(:menu, weekly_price: 100, price: 200)
  meal = FactoryGirl.build(:meal, menu: menu)
  price = meal.price
end

出现此错误的最后一行失败:

1) Order has the weekly discount
   Failure/Error: price = meal.price

   NoMethodError:
     undefined method `price' for nil:NilClass
   # ./spec/models/order_spec.rb:17:in `block (2 levels) in <top (required)>'

这就是Meal

中价格的定义方式
class Meal < ApplicationRecord
  extend Forwardable
  belongs_to :menu

  def_delegators :@menu, :price
end

如果我将其更改为:

class Meal < ApplicationRecord
  extend Forwardable
  belongs_to :menu

  def price
    menu.price
  end
end

测试通过。我在其他地方使用def_delegators,并且所有测试都失败了NoMethodError

1 个答案:

答案 0 :(得分:2)

此代码

def_delegators :@menu, :price

这段代码

def price
  menu.price
end
他们做了不同的事情。委托方法,而不是(不存在的)实例变量

def_delegators :menu, :price