2013-03-14 49 views
0

我在我的控制器中有一個連接到第三方api的動作並做了一些工作。如果代碼成功,則保存我的用戶。如果第三方API失敗,那麼用戶不會被保存。第三方api需要存根/嘲012

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

我希望在不必擔心第三方應用程序代碼來測試User.create代碼。我知道存根和嘲諷,並理解在一個測試實例方法和其他類方法中的差異。我不確定如何在我的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 

其他人可能會說不同的解決方案,如果我在這種情況下我會選擇VCR。

+0

+1錄像機很好 – dusan 2013-03-14 21:27:34

+0

嗯這個項目有錄像機我只是還沒有采用它在我的測試呢。將研究它。謝謝。如果沒有人提出更好的答案,我會在一兩天內給出答案。 – jason328 2013-03-14 21:46:00