LoginSignup
11
9

More than 3 years have passed since last update.

ActiveStorageとFakerを利用した際に、画像を含めたテストをする方法

Last updated at Posted at 2020-09-02

【概要】

1.結論

2.なぜFakerでimageを作らずに、fixture_file_uploadを使うのか

3.どのように使うのか

4.ここから学んだこと

1.結論

fixture_file_uploadメソッドを使用する。


2.なぜFakerでimageを作らずに、fixture_file_uploadを使用なのか

理由は1つです。

ActiveStorageを利用しているのでimageカラムを作っていません。なので、Fakerで作ることができない(仮に具体的な画像を入れるにしてもspec/factoriesにはimageカラムがないので設定できない)からです。

たとえimageカラムを作っていたとすると、Fakerで画像をランダムで生成(適当に拾ってくる)方法がわかりませんでした。(Fakerにそのような機能はGithubに見当たりませんでした。)


3.どのように使うのか

答えは簡単で、spec/modelsの該当ファイルに、
fixture_file_upload(該当ディレクトリの画像ファイル)をインスタンス変数に代入するだけです。
(Fakerを利用せずに、具体例をspec/factoriesにプログラムしている場合はローカル変数になると思います)

spec/models
require 'rails_helper'

RSpec.describe BuyItem, type: :model do
  describe '#create' do
    before do

      @buy_item = FactoryBot.build(:buy_item)
      @buy_item.image = fixture_file_upload('app/assets/images/aiueo.png')

    end
  end
end

このような記述になります!
spec/factoriesで具体例をプログラムしていない(Fakerを使用しているかつ、imageカラムがない)ので適当な具体的な画像を直接的にインスタンス変数に入れました。そうすることで、”@buy_item”に直接的に画像を入れているので"Image can't be blank"というエラーがなくなります。

5.ここから学んだこと

ActiveStorageのgemを利用しているのにもかかわらず、カラム名に"image"を作っていました。またFakerでimageを作ろうにもやり方がわからず、カラム名を削除しました。その後、imageをFakerに頼らず(ランダム生成ではなく適当な画像を)インスタンス変数に代入しようかといろいろ検索した結果、fixture_file_uploadに行きつき救われました!

参考URL:rspecを使用してファイルのアップロードをテストする-rails

11
9
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
11
9