画像ファイル付きのモデルテストコードで忘れていたのでアウトプットします。
テスト用画像をアプリケーションファイルへ配置するためにpublicディレクトリにimagesディレクトリを作成
作成したimagesディレクトリの中に画像を配置する
例:(public/images/テスト用画像ファイル)
class Item < ApplicationRecord
belongs_to :user
has_one_attached :image
省略
validates :image, presence: true
end
validatesは、presence: trueで良いみたいでした。
該当のfactoriesディレクトリに画像を開くための記述をする
afterメソッド
任意の処理の後に指定の処理を実行することができる
after(:build) とすることで、インスタンスがbuildされた後に指定の処理を実行できる
FactoryBot.define do
factory :item do
省略
after(:build) do |item|
item.image.attach(io: File.open('public/images/テスト用画像ファイル'), filename: 'テスト用画像ファイル')
end
end
end
# io: File.openで設定したパスのファイル(public/images/test_image.png)を、test_image.pngというファイル名で保存
テストコードを記述するファイル(今回はitem_spec.rbファイル)での記述方法
省略
it 'nameが空では保存できない' do
@item.name = ''
@item.valid?
expect(@item.errors.full_messages).to include("Name can't be blank")
end
it '商品の画像がないと保存できない' do
@item.image = nil #←ActiveStorageを使用していると""だとエラーが出るため、nilを使って空欄を演出する
@item.valid?
expect(@item.errors.full_messages).to include("Image can't be blank")
end
省略
今までは""で統一して実装していたけど今回のテストコードで勉強になりました。
バリデーションの掛け方やテストコードの記述方法は他にもあると思いますが、ひとまずは、テストコードがグリーンになったので機能していると思われます。