rspec嘲笑外部api

时间:2011-07-17 18:56:58

标签: testing rspec mocking twilio

这里是TDD的新手,d哦!

以下是我想要测试的内容(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

生成错误:nil的未定义方法`request':NilClass

我采取了正确的方法吗?谢谢!

3 个答案:

答案 0 :(得分:4)

结帐webmock。这就是你想要用于这样的东西。

答案 1 :(得分:4)

当您执行此操作时,您将使用0参数对其进行存根:

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

但你的考试是:

Twilio::RestAccount.new(ACCOUNT_SID, ACCOUNT_TOKEN)

这是2个参数的新内容。

尝试:

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

并删除:

Twilio::RestAccount.should_receive(:new)

答案 2 :(得分:4)

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

好处是你通过手动测试让它工作一次,它基本上验证你不会弄乱任何东西。缺点是,无论何时触摸VCR测试的代码,您都必须手动重新测试由VCR测试的所有内容。还有其他需要考虑的事情。