rspec mocking external api

问题描述:

这里是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

我正在采取正确的做法吗?谢谢!

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

好处是你可以通过手动测试使它工作一次,它基本上验证了你不会搞砸任何东西。不足之处在于,无论何时您触摸通过VCR测试的代码,您通常都必须手动重新测试通过VCR测试的所有内容。还有其他要考虑的事情。

+0

由于这个问题被问到,我已经成为VCR的粉丝! –

结账webmock。这真的是你想用于这样的事情。

你磕碰新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)