2011-04-22 5 views
2

나는 분명히 인증을 위해 Devise를 사용하고 있는데, 사용자 객체에 대해 메소드가 호출되는지 테스트하려고합니다. 그래서 내 사양은 다음과 같습니다Devise, Rspec, 사용자 기대

it "should retrieve something for user" do 
    @user = Factory.create(:user) 
    sign_in @user 
    @user.expects(:something) 
    get :manage 
end 

내가 예상하는 것입니다이 문제 실패 내가 할 않는 : 컨트롤러의 CURRENT_USER 호출을 날조

it "should retrieve something for user" do 
    @user = Factory.create(:user) 
    sign_in @user 
    controller.stubs(:current_user).returns @user 
    @user.expects(:something) 
    get :manage 
end 

가 날조 한 것 같다 sign_in의 @user가 고안 경우 시험 도우미. 디버거에서 파기 한 후에도 current_user를 속이지 않을 때 @user가 실제로 반환되므로 기대가 충족되지 않은 이유를 모르겠습니다.

아이디어가 있으십니까?

답변

3

현재 사용자가 세션에 저장되기 전에 직렬화됩니다. 가능성이 액티브 사용자 모델, 그것은 사용자의 ID를 저장하는 것은 :

https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/helpers.rb#L47-49

이이 세션에서 USER_ID을 찾는 것 :

https://github.com/plataformatec/devise/blob/master/lib/devise/test_helpers.rb#L49

이 컨트롤러가 사용자를 다시 가져 오는 경우 있음을 의미 , 그리고 데이터베이스에서 사용자를 다시 불러올 수 있습니다.

컨트롤러의 #current_user가 반환 한 User 객체는 테스트에서 #sign_in에 전달한 @user와 다른 Ruby 객체이므로 스텁과 한 객체의 기대치가 다른 객체에 연결되지 않습니다.

나는 Devise/Warden을 광범위하게 사용하지는 않았지만 이것이 어떻게 진행되고 있는지 꽤 확신합니다. 두 개의 인스턴스에서 #object_id를 인쇄하여이 사실을 확인할 수 있습니다.

까다로운 의미 갱신 2014년 2월 :

, 여기 컨트롤러에서 벌금 접근 방식을 #current_user이다 스텁 테스트중인 시스템의 "경계"의 당신의 정의에 따라 (SUT) - 즉 컨트롤러. #current_user 메서드가 Devise에 의해 정의되고 Devise에 의해 컨트롤러에 섞여 있다고 가정하면 #current_user은 SUT의 외부이므로 스텁을위한 페어 게임이라고 주장 할 수 있습니다.

사용자는 @user 개체를 반환하기 위해 스텁으로 User.find을 호출하여 Devise가 액세스하는 기본 계층 (ActiveRecord)을 스터핑 할 수 있습니다. 즉, 귀하의 사양이 동작 구현과 Devise 구현을 모두 #current_user으로 테스트 중이므로 나중에 변경되는 경우 사양이 실패합니다.

User.find(args)을 사용하고 그 방법을 스텁했다고 가정하면 코드가 변경되지 않았지만 기본 라이브러리에 있고 사양이 실패합니다. 그 다음 버전의 Devise가 User.where(args).first()으로 변경되었습니다. 이 아이디어에 대해 매우 일반적으로 생각할 때, 나중에 (http 라이브러리를 나중에 스왑 할 수 있도록 Net::HTTP 메서드를 스터 빙하지 않고 WebMock 등의 원시 HTTP 응답을 조롱하는 것에 대해 생각하는) 시간과 그렇지 않은 경우가 있습니다. 어쩌면이 Devise 질문은 하나로 간주됩니다.)

+0

지난 밤에 파기가 끝난 후 당신이 옳다는 것을 알 수 있습니다! 정보 주셔서 감사합니다. –

+0

마지막으로 수 시간 동안 검색을 한 후에 솔루션을 ... 감사합니다! – lambinator

관련 문제