2011-12-29 1 views
3

내 컨트롤러 스펙에서 조롱을 위해 다음 모델/스펙을 어떻게 설정합니까? 여기 RSpec을 사용하여 ActiveRecord 동적 파인더를 스터 빙

내가 몇 가지 예에 대한 사용자를 조롱 할,

class User < ActiveRecord::Base 
    has_many :favorites 
end 

class Favorite < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :place 
end 

class Place < ActiveRecord::Base 
    has_many :favorites, :as => :favorable 
end 

그런 다음 어떤 시점에서 장소가 지금 현재 좋아하는

@favorite = @current_user.favorites.find_by_place_id(@place.id) 

입니다 있는지 확인합니다 모델입니다

it "should be success" do 
    user = double("User") 
    user.stub(:favorites) 
    get :show, :id => "1081651" 
    response.should be_success 
end 

그러나 결국 나는

undefined method `find_by_place_id' for nil:NilClass 

내가 할 수있는 일 : 즐겨 찾기가 통과하도록 돕습니다. 역동적 인 파인더가 사용 되었기 때문에 나는 그것을 올바르게 조롱하는 방법을 잘 모릅니다. 모든 예기치 않은 메시지를 무시합니다

답변

2

사용의 null 오브젝트의 그루터기 : 나는 그것의 다양한 버전과에서 반환 전무을 시도

user.stub_chain(:favorites, :find_by_place_id) 
+0

:

user.stub(:favorites).and_return(double.as_null_object) 

또 다른 방법은 stub_chain 방법을 사용하는 것입니다 the : 즐겨 찾기 스텁,하지만 운이 없다. 문제는 메서드가 예상되지 않는다는 것이지, find_by_place_id가 작동 할 수있는 무언가를 반환해야하며, 무 처리로 작동 할 수 없다는 것입니다. – RyanW

+0

@ RyanW 오른쪽, 스텁 된 '즐겨 찾기'메소드에서 null 객체를 반환 해 봅니다. 답변을 수정했습니다. –

1
favorite = double('Favorite') 
user.stub_chain(:favorites, :find_by_place_id) { favorite }