我正在编写一个 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?但我不认为它完全一样......?)