#はじめに
はじめまして。かちゃあ(@katya_swa)と申します。
Qiita 初投稿です。
CarrierWave、FactoryBotを使って、画像ファイルをmodelスペックへテストを通す事になったので、
調べたことをまとめようと思います。
#環境
ruby 2.5.1
rails 5.2.3
carrierwave
factory_bot_rails
#fixturesディレクトリの作成
まずspec内にfixturesディレクトリがない場合は、作成する。
その後、使いたい画像ファイルをfixturesディレクトリの中に入れる。
ここでは私の場合は、spec/fixturesの中にtest.jpgという画像ファイルを入れています。
#モデル内アップローダの確認
class Item < ApplicationRecord
mount_uploader :picture, PictureUploader
validates :picture, presence: true
end
pictureアップローダーがある事を確認します。
ちなみに私の場合はpictureカラムを必須にしています。
#FactoryBot内でpictureアップローダを呼び出す
FactoryBot.define do
factory :item do
content { '紹介文' }
picture { Rack::Test::UploadedFile.new(File.join(Rails.root, 'spec/fixtures/test.jpg')) }
tag_list {'テスト'}
user
end
end
このように記述すると画像を含めたモデルスペックのテストが通るようになりました。
もしも、テスト内で何度も画像添付ファイルを繰り返すのであれば、
下記のように添付ファイルを属性値に含めてしまうのと良いみたいです。
trait :with_picture do
picture { File.new("#{Rails.root}/spec/fixtures/picture.jpg") }
end
これでテスト内でFactoryBot.create(:item, :with_picture)
と書けば
引数を渡してくれるので画像ファイルがある状態の新しいitemを作成することができるようになります。
もしテストを高速化させたい場合は、アップロードフォルダを分けたり、
テスト終了ごとに画像ファイルの消去設定することが必要みたいです。
また、この他にも Paperclipを使ったファイルアップロードのテスト方法もありました。
今後テスト内容を増やす事になると、さらに細かい設定が必要だと思うので、
必要になり次第、学習していきたいと思います。
#参考元
https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Use-test-factories
https://til.codes/testing-carrierwave-file-uploads-with-rspec-and-factorygirl/
https://qiita.com/motty93/items/5cbc46ce79a502fcaa65
Everyday Rails - RSpecによるRailsテスト入門