内部でAWSなどの外部サービスに接続してリクエストを送信する処理がある場合にその処理の呼び出し、および引数を確認したい時のコード例です。
外部サービスに接続するクライアント実装をモックする都合上 it
内部でモックの準備をする必要があるのがポイントになります。
# 外部サービスに接続する実装のイメージ
class HogeClient
def send_message(arg)
# 外部サービスに接続してリクエストする処理
end
end
it 'HogeClientのsend_messageメソッドが呼び出され、引数に「fuga」が渡される' do
client = spy(HogeClient)
allow(HogeClient).to receive(:new).and_return(client)
# 検査対象の実行
# 外部サービスに接続する処理の呼び出しと引数の確認
expect(client).to have_received(:send_message).with('fuga').once
end
なお、検査対象のメソッドが クラスメソッド なら spy
でインスタンスを生成する必要もなく、呼び出されるメソッドを上書きするだけで済みます。
# 外部サービスに接続する実装のイメージ
class HogeClient
def self.send_message(arg)
# 外部サービスに接続してリクエストする処理
end
end
before do
allow(HogeClient).to receive(:send_message).and_return(true)
end
it 'HogeClientのsend_messageメソッドが呼び出され、引数に「fuga」が渡される' do
# 検査対象の実行
# 外部サービスに接続する処理の呼び出しと引数の確認
expect(HogeClient.send_message).to have_received(:send_message).with('fuga').once
end