2014-10-08 6 views
3

스텁 방법 : 포함 된 모듈의 수퍼 메소드.컨트롤러의 스텁 수퍼 방법

class ImportsController < BaseController 
    include ImportBackend 

    def import_from_file 
    super 
    rescue TransferPreview::Error => exc 
    flash[:error] = "Some String" 
    redirect_to imports_path 
    end 
end 

그리고 importBackend 모듈 :

module ImportBackend 
    def import_from_file 
    //something 
    end 
end 

내가 그 컨트롤러를 테스트 할 나는 다음과 같은 컨트롤러를 가지고있다. 내 질문은 ImportBackend 메서드를 스텁하여 오류를 발생시키는 방법입니까? 몇 가지 해결책을 시도했지만 아무것도 작동하지 않습니다.

ImportBackend.stub(:import_from_file).and_raise(Transfer::Error) 
controller.stub(:super).and_raise(Transfer::Error) 
controller.stub(:import_from_file).and_raise(Transfer::Error) 

모든 답변 주셔서 감사합니다. 루비 super에서

답변

6

는 방법처럼 보이지만 실제로는 특별한 행동 (예를 들어, supersuper() 다른 모든 루비 방법과는 달리, 다른 일을)와 키워드, 그리고 당신이 그것을 스텁 수 없습니다.

super이 호출하는 방법을 스텁하는 것입니다.이 경우는 ImportBackend#import_from_file입니다. 모듈 (슈퍼 클래스가 아닌)의 믹스 인이기 때문에 일반적인 방법으로 스텁을 작성할 수 없습니다. 그러나 원하는 모의 동작을 가진 더미 모듈을 정의하고 클래스에 include을 정의 할 수 있습니다. 이것은 여러 모듈이 mixin을 정의 할 때 super이 마지막에 포함 된 것을 호출하기 때문에 작동합니다. 당신은 read more about this approach here 일 수 있습니다. 다른 사양에 따라

mock_module = Module.new do 
    def import_from_file 
    raise Transfer::Error 
    end 
end 

controller.singleton_class.send(:include, mock_module) 

, 이것은 분해와 합병증을 소개 수,하지만 난 당신이 시작하는 데 도움이되기를 바랍니다 : 귀하의 경우, 그것은 다음과 같이 보일 것입니다.

+0

나를 위해 작동하지 않습니다. ImportBackend # import_from_file을 스텁하고 싶습니다. 귀하의 솔루션을 사용했지만 테스트가 여전히 실패했습니다. – user2239655

+0

죄송합니다, @ user2239655, 질문을 잘못 읽었습니다. 내 대답을 업데이트했습니다. –

+0

큰 감사;) – user2239655