2

我正在编写一个 Rails 应用程序来使用 Twilio API 发送短信:

http://www.twilio.com/docs/api/rest/sending-sms

为此,我这样做:

client = Twilio::REST::Client.new account_sid, auth_token
client.account.sms.messages.create({
    # stuff ...
}) 

这一切都很好——但是,我不希望我的测试发送一堆短信,因为那会很愚蠢。所以,我想覆盖 Twilio::REST::Client.new 给我一个对象,让我可以acccount.sms.messages.create在我的测试中调用而不会过分大惊小怪。

我有一个可行的解决方案,但感觉很难看:

def mock_twilio_service(stub_client)
  Twilio::REST::Client.stub :new, stub_client do
    yield
  end
end

class Recordy
  attr_accessor :calls
  def initialize
    @calls = []
  end

  def method_missing(method, *args)
    ret = self.class.new
    @calls << {
      method: method,
      args: args,
      block_given: block_given?,
      ret: ret
    }
    yield if block_given?
    ret
  end
end

然后在我的测试中:

test "send a text" do
  cli = Recordy.new
  mock_twilio_service cli do
    # ... stuff
  end
end

我觉得我错过了一些超级明显的东西,但我不确定。我是吗?或者我完全是在叫错树?(是的,我看过How do I mock a Class with Ruby?但我不认为它完全一样......?)

4

2 回答 2

1

Twilio 布道者在这里。

我们正是针对这种情况编写了测试凭证。测试凭据是一组特殊的凭据(AccountSid 和 AuthToken),您可以在向 Twilio REST API 发出请求时使用它们,告诉它基本上只是通过拨打电话或发送短信的动作,但实际上并非如此去做(或向你收费)。

您还可以使用一组特殊的电话号码让 Twilio 返回特定的成功或错误条件。

您可以在Twilio 仪表板中找到您的测试凭据。

希望有帮助。

于 2013-07-24T23:13:53.983 回答
1

另一个想法是使用WebMock。当您的客户向 Twilio 发出请求时。您可以将请求存根。在存根中,您还可以定义从请求返回的内容以及可以调用的参数。

当你设置

   WebMock.disable_net_connect!

可以肯定的是,无法从测试中提出真正的请求。

这样您就不会更改测试的任何行为,也不会依赖外部 API 来通过测试。

于 2013-07-25T07:43:39.587 回答