こんにちは!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