Rspecで画像アップロードのテストデータを準備する

こんにちは!kossyです!




さて、今回はRspecで画像アップロードのテストデータを準備する方法について、
ブログに残してみたいと思います。




環境
Ruby 2.5.1
Raila 5.2.3
MacOS Mojave



Rack::Test::UploadedFileクラスを使う

Wraps a Tempfile with a content type. Including one or more UploadedFile's in the params causes Rack::Test to build and issue a multipart request.

出典: www.rubydoc.info

Tempfileをcontent_typeでラップしてくれるクラスです。


これを使って、画像アップロードのためのモックデータを準備できます。



使い方は簡単で、

params = {
  image: Rack::Test::UploadedFile.new(File.join(Rails.root, 'spec/fixtures/profile.png'), 'image/png')
}

みたいにパラメータとして定義したり、

FactoryBot.define do
  factory :article do
    title { Faker::Book.title }
    body { Faker::Lorem.sentences }
    released_at { (Date.today - 1) }
    expired_at { (Date.today + 1) }
    member_only { false }
    thumbnail {  Rack::Test::UploadedFile.new(File.join(Rails.root, 'spec/fixtures/profile.png'), 'image/png') }
  end
end


みたいにFactoryBotのモックデータとしても定義できます。

第一引数で画像のパスを指定し、第二引数でコンテンツのタイプを指定します。
ちなみに第二引数に何も指定しないと、コンテンツタイプがtext/plainになるので、コンテンツタイプでバリデーションを
かけている場合は気をつけましょう。(私は30分ハマりました)



参考にさせていただいた記事

https://github.com/rack-test/rack-test/blob/master/lib/rack/test/uploaded_file.rb
https://www.rubydoc.info/github/brynary/rack-test/Rack/Test/UploadedFile
https://qiita.com/selmertsx/items/2beb0d7ec0774cbbf050
https://qiita.com/tatsuya1156/items/f03c53917d72cdca053a
http://sissoko.hatenablog.com/entry/2016/07/08/131344