Twilio API を使用してテキスト メッセージを送信する Rails アプリを作成しています。
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? を見てきましたが、まったく同じではないと思います...?)