はじめに
仕事で、Ruby on Railsを用いてS3から署名付きURLを発行する処理を実装しました。
こちらの記事を参考にして行いました。
そしてRspecのテストを行おうとしたのですが、以下の記事を参考にして詰まってしまったためまとめたいと思います。
Ruby AWS SDK v2 でS3の署名付きURLを発行する
問題
以下のコードを実装して、テストを行おうとしました。
s3_download.rb
s3 = Aws::S3::Client.new
signer = Aws::S3::Presigner.new(client: s3)
signer.presigned_url(:get_object,
bucket: 'your-bucket',
key: 'path/to/object')
しかし、Rspecでどのようにスタブを使えばよいかわからず、また検索しても記事が少なかったのです。
解決方法
以下のようなテストを書くことで解決しました。 context以下から書いています。
test_request.rb
let(:url) { 'test_url' }
before do
signer = instance_double(Aws::S3::Presigner)
allow(Aws::S3::Presigner).to receive(:new).and_return(signer)
allow(signer).to receive(:presigned_url).and_return url
end
it '署名付きURLが返ってくること' do
result
expect(response.body).to include url
end
またbefore do
を無くして、itのなかにallow
を書いても同じことが実現できます。(ただしrubocopに怒られる)
test2_request.rb
it '署名付きURLが返ってくること' do
allow_any_instance_of(Aws::S3::Presigner).to receive(:presigned_url).and_return url
resutl
expect(response.body).to include url
end
ちなみに例外は以下のように起こしてます。
test_request.rb
allow(signer).to receive(:presigned_url).and_raise(StandardError)
おわりに
テストを書く人は多いかなと思ったのですが、あまり記事がなかったのでまとめてみました。
署名付きではなくS3から単純にダウンロードしてくるパターンはあったのでそちらが多いのでしょうか。
公式のドキュメントがどのように対応しているかよくわからなかったので、同じ問題で困っている方の参考になれば幸いです。