2011-07-17 61 views
3

這裏是TDD的新手,哦!rspec mocking external api

這就是我想要的測試(ruby library),簡言之:

account = Twilio::RestAccount.new(ACCOUNT_SID, ACCOUNT_TOKEN) 
    resp = account.request(
     "/#{API_VERSION}/Accounts/#{ACCOUNT_SID}/SMS/Messages", 
     'POST', 
     smsInfo 
    ) 

而這裏的測試代碼的嘗試:

describe Text do 
    it "should call the Twilio API with credentials" do 
    #pending "mocking api although not passed in.." 
    t = mock(Twilio::RestAccount) 
    twapi = mock("new twapi").should_receive(:request).and_return(Net::HTTPSuccess) 
    t.stub(:new).and_return(twapi) 

    Twilio::RestAccount.should_receive(:new) 

    sms = Factory.create(:boring_sms) 
    sms.send_sms 
    end 
end 

產生錯誤:未定義的方法`要求」的零: NilClass

我正在採取正確的做法嗎?謝謝!

回答

3

隨着Twilio和其他外部服務,我也考慮使用VCR。 http://relishapp.com/myronmarston/vcr

好處是你可以通過手動測試使它工作一次,它基本上驗證了你不會搞砸任何東西。不足之處在於,無論何時您觸摸通過VCR測試的代碼,您通常都必須手動重新測試通過VCR測試的所有內容。還有其他要考慮的事情。

+0

由於這個問題被問到,我已經成爲VCR的粉絲! –

4

你磕碰新0的參數,當你這樣做:

t.stub(:new).and_return(twapi) 

但是你的測試是:

Twilio::RestAccount.new(ACCOUNT_SID, ACCOUNT_TOKEN) 

這是新的有2個PARAMS。

嘗試:

t.should_receive(:new).once.with(any_args()).and_return(twapi) 

,並刪除:

Twilio::RestAccount.should_receive(:new)