我正在编写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?,但我认为它不一样......?)
答案 0 :(得分:1)
Twilio福音传教士在这里。
我们为这个场景写了Test Credentials。测试凭据是一组特殊的凭据(AccountSid和AuthToken),当您向Twilio REST API发出请求时,您可以使用它来告诉它基本上只是通过打电话或发送短信的动作,但实际上并没有这样做(或收取你的费用)。
您还可以使用一组特殊的电话号码让Twilio返回特定的成功或错误条件。
您可以在Twilio dashboard。
中找到测试凭据希望有所帮助。
答案 1 :(得分:1)
另一个想法是使用WebMock。当您的客户向Twilio提出请求时。你可以直接发出请求。在存根中,您还可以定义从请求返回的内容以及可以调用的参数。
当你设置
WebMock.disable_net_connect!
确保测试无法提出任何实际请求。
这样您就不会更改测试的任何行为,也不会依赖外部API来传递测试。