2014-05-17 2 views
2

누군가이 스펙이 실패한 이유를 설명 할 수 있습니까?이 Ruby 조건부 할당이 메모로 저장되지 않는 이유는 무엇입니까?

RSpec에 결과 : 그것은 한 번만 @presenter를 지정해야합니다 조건 할당 연산자에 대한 이해에서

User#presenter memoizes presenter 
    Failure/Error: user.presenter 
     (<UserPresenter (class)>).new(...) 
      expected: 1 time with any arguments 
      received: 2 times with arguments: (...) 

.

UserPresenter.should_receive(:new).once 

이 코드 덩어리가 단순히 UserPresenternew 방법을 한 번받을 것이라는 기대를 설정 :

# app/models/user.rb 
def User 
    def presenter 
     @presenter ||= UserPresenter.new(self) 
    end 
end 

# app/presenters/user_presenter.rb 
class UserPresenter 
end 

# spec/models/user_spec.rb 
describe User do 

    let(:user){ build_stubbed(:user) } 

    describe "#presenter" do 
     it "memoizes presenter" do 
      UserPresenter.should_receive(:new).once 
      user.presenter 
      user.presenter # should not call .new 
     end 
    end 
end 
+0

왜 'UserPresenter.should_receive (: new) .once.with (...)'가 아닌가요? –

+0

@ArupRakshit은 올바른 인수를 사용하여 호출되었음을 테스트하는 것이 좋지만 '수신 된 값 : 인수가있는 2 번 ...'을 변경하지 않습니다. – max

+0

'let! (: user) {build_stubbed (: user)}'와'UserPresenter.should_receive (: new) .once.with (user)'를 할 수 있습니까? –

답변

1

문제는이 라인입니다. 원래 UserPresenter#new 메서드를 해체하고 nil을 반환하는 메서드로 바꿉니다. nil이 위조 되었기 때문에 @presenter 인스턴스 변수는 메모되지 않습니다. 당신이 절대적으로 원래의 방법

UserPresenter.should_receive(:new).once.and_call_original 
를 호출 할 경우

UserPresenter.should_receive(:new).once.and_return "some truthy value" 

또는 동등

UserPresenter.should_receive(:new).once { "some truthy value" } 

또는 :

이 문제를 해결하려면, 당신은 당신의 기대에 반환 값을 지정할 수 있습니다

또는 새 예상 구문

메시지 예상에 대한 자세한 내용은 this을 참조하고 원래 방법 호출에 대한 자세한 내용은 this을 참조하십시오. This에는 RSpec의 should_receive 메소드에 대한 몇 가지 추가 논의가 있습니다.

관련 문제