LoginSignup
41
44

More than 3 years have passed since last update.

FactoryBotとCarrierWaveを使ってRSpecに画像ファイルアップロードのテストを通す

Posted at

はじめに

はじめまして。かちゃあ(@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という画像ファイルを入れています。

モデル内アップローダの確認

app/models/item.rb

class Item < ApplicationRecord
  mount_uploader :picture, PictureUploader
  validates :picture, presence: true
end

pictureアップローダーがある事を確認します。
ちなみに私の場合はpictureカラムを必須にしています。

FactoryBot内でpictureアップローダを呼び出す

spec/factories/items.rb
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

このように記述すると画像を含めたモデルスペックのテストが通るようになりました。

もしも、テスト内で何度も画像添付ファイルを繰り返すのであれば、

下記のように添付ファイルを属性値に含めてしまうのと良いみたいです。

spec/factories/items.rb
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テスト入門

41
44
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
41
44