[実現したいこと]
RSpecを使用し、画像投稿時のバリデーションテストを実現したい
[現状・関連コード]
- 画像投稿には、ActiveStorage を使用
- バリデーションは、8MB以上のファイルサイズで投稿しようとした際に、画像は投稿されないようにモデルで設定しました。
models/Product.rb
validate :validate_image def validate_image return unless image.attached? if image.blob.byte_size > 8.megabytes image.purge errors.add(:image, '1つのファイル8MB以内にしてください') end end
models/product_spec.rb
# frozen_string_literal: true require 'rails_helper' RSpec.describe Product do describe '#create' do # 8MB以上のファイルサイズは無効である。 it 'is invalid with a file size of 8MB or more' do @product = create(:product) @product.image = fixture_file_upload("/files/test_image.jpg") expect(@product).not_to be_valid end end end
spec/fixtures/files に("/files/test_image.jpg")8MB以上のサンプル画像を保存しており、バリデーションエラーとなるようにテストの際に呼び出しています。
[出現するエラー]
Failures: 1) Product#create is invalid with a file size of 8MB or more Failure/Error: image.purge FrozenError: can't modify frozen Hash # ./app/models/product.rb:17:in `validate_image' # ./spec/models/product_spec.rb:17:in `block (3 levels) in <main>' Failed examples: rspec ./spec/models/product_spec.rb:14 # Product#create is invalid with a file size of 8MB or more
上記のエラーを調べてみたところ、
「オブジェクトの中身を変更できなくなっている」のに変更をしようとしているので出るエラー。freezeを解除する方法があれば解決する
とのことだったのですが、どのように対処したらいいかわからないため、このエラーの対処法として、アドバイスをいただけると幸いです????♀️
宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。