2017-09-08 4 views
0

레일 테스트를 위해 FactoryGirl과 Rspec을 사용하고 있으며 def_delegators을 사용하여 정의 된 메소드를 사용할 때 문제가 발생했습니다. 예를 들어FactoryGirl - def_delegators를 호출 할 때 NoMethodError

이 테스트 :

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으로 실패했습니다.

답변

2

이 코드

def_delegators :@menu, :price 

그리고 그들은 다른 일을이 코드

def price 
    menu.price 
end 

. 방법에 위임 아닌 (존재하지 않는) 예 변수

def_delegators :menu, :price 
+0

을했지만, 나는이 문서를 다음되었다 그 http://ruby-doc.org/stdlib-2.0.0/libdoc/forwardable/ rdoc/Forwardable.html 언제 사용해야합니까? – moondaisy

+1

@moondaisy : 언제 인스턴스 변수에 위임을 사용해야합니까? 독자가없는 인스턴스 변수가있을 때. 나, 가능할 때마다 독자들을 사용하는 것을 선호한다. –