概要

Railsのテストで、画像をアップロードして保存する動作をテストしたいということがあります。

そこで、テストで画像をアップロードする方法を紹介します。

もし、テストの実行時にfixtureで画像を保存したいという場合は、Railsのテストでfixtureに画像を登録する方法に、方法を書いています。

環境

  • Rails 5.1
  • CarrierWave

CarrierWaveは、データがサーバに送られて来た際に、画像を保存するために利用しているGemです。

必ずCarrierWaveを使う必要はありません。

画像データ

データベースに保存する画像のデータは、アップロードした画像のパスをデータベースに保存するというような状況を想定しています。

そのため、保存する画像のデータは文字列です。

もし、画像をバイナリとしてデータベースに保存する場合は、今回説明する方法は使えません。

画像の用意

今回データベースに登録する画像は、test/fixtures/files/images/の中に保存しました。画像の名前はtest.pngです。

もし別のファイル名で保存したり別の場所に画像を置いたりしている場合は、適宜説明を読み替えてください。

保存

ここでは、POSTリクエストで画像をアップロードするためのコードで、画像のアップロードの方法を説明します。

画像は、imageという名前のカラムに保存する場合、このようなコードになります。

post *******_url(*******), params: { *****: { image: Rack::Test::UploadedFile.new(Rails.root.join('test', 'fixtures', 'files', 'images', 'test.png'), 'image/png') } }

重要な部分は、Rack::Test::UploadedFile.new(Rails.root.join('test', 'fixtures', 'files', 'images', 'test.png'), 'image/png')の部分です。

画像の情報として、Rack::Test::UploadedFileを指定すればRailsでは画像として認識してくれます。

Rack::Test::UploadedFileの引数に、画像のパスを指定します。画像のパスは、Rails.root.joinで生成しています。

まとめ

分かってしまえば簡単なのですが、この方法を見つけ出すのに時間がかかってしまいました。

誰かの参考になれば幸いです。