2
0

More than 1 year has passed since last update.

RspecでAWS SDKでS3の署名付きURL発行のテストをする (Ruby on Rails)

Posted at

はじめに

仕事で、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から単純にダウンロードしてくるパターンはあったのでそちらが多いのでしょうか。

公式のドキュメントがどのように対応しているかよくわからなかったので、同じ問題で困っている方の参考になれば幸いです。

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0