2013-03-14 2 views
0

컨트롤러에 제 3 자 api에 연결하는 작업이 있습니다. 코드가 성공하면 내 사용자가 저장됩니다. 타사 API가 실패하면 사용자는 저장되지 않습니다.제 3 자 API로 스터 빙/조롱이 필요합니다.

def create 
    if ThirdPartyApp.connect.eql? true 
    User.create(params[:user]) 
    else 
    redirect home_path 
    end 
end 

제 3 자 앱 코드에 대해 걱정할 필요없이 User.create 코드를 테스트하고 싶습니다. 나는 스터 빙 (stubbing)과 조롱 (mocking)에 대해 알고 있으며 인스턴스 메소드와 다른 클래스 메소드를 테스트한다는 차이점을 이해합니다. 타사 앱이 작동하는 데 필요한 특정 조건을 테스트에서 충족시킬 수 없기 때문에 rspec 테스트에서이 방법을 사용하는 방법을 잘 모르겠습니다. 스텁, 조롱 또는 일부 다른 방법으로이 테스트를 작성할 수있는 방법에 대한 도움이 될 것입니다.

답변

3

몇 가지 솔루션은 여기에 있습니다 :

먼저, VCR 같은 도구를 사용할 수있다 (라이언 베이츠는이에 great screencast이있다!) 그런 식으로, 당신은 API의 응답으로 테스트를 처음 실행 두 번째 이후부터는 자신의 용어를 사용하기 위해 '녹음'을 '재생'합니다.

API 응답에 크게 의존하는 요청에 스텁/조롱을 사용하는 것은 어려울 수 있습니다. 그것은 나에게 있었다 (그리고 난 당신이 컨트롤러 액션 테스트하는 방법에 대해 추측하고있다) 그리고

it "creates user" do 
    ThirdPartyApp.any_instance.stub(:connect) { true } 
    # fill in form or submit params as required 
    User.count.should == 1 # or some other assertion 
end 

을 경우에 당신은 존재하지 테스트 할 수 있습니다

it "fails from the api" do 
    ThirdPartyApp.any_instance.stub(:connect) { false } 
    # fill in form or submit params as required 
    current_path.should == '/whatever' # or some other assertion 
end 

기타 다른 솔루션을 주장 할 수 있으며, 경우에 I 이 상황에서 VCR과 함께 갈 선택을했습니다.

+0

+1 VCR은 훌륭합니다. – dusan

+0

음,이 프로젝트에는 VCR이 있습니다. 아직 테스트에서 채택하지 않았습니다. 그것을 들여다 볼 것입니다. 감사. 아무도 더 나은 대답이 나오지 않으면 하루 이틀 안에 답변을 드리겠습니다. – jason328