【概要】
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に行きつき救われました!