初心者の私がactivestorageを使ったときのテストコードで1時間ほど詰まったのでその備忘録です
まず前提として、必要なactivestorageやfactorybot、specのインストールは済ませているものとします。
済ませていなければ以下のgemをgemfileに記述しbundle installしましょう
その後RSpecのインストールをしましょうrails g rspec:install
group :development, :test do
gem 'rspec-rails' #この3行を記述、テストをするためのgem
gem 'factory_bot_rails' #この3行を記述、テスト用のテンプレートを作成するためのgem
gem 'pry-rails' #この3行を記述、bindind.pryを実行するためのgem
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
% bundle install
% rails g rspec:install
まずpublicのディレクトリ下にimagesと言うファイルを作成する
そのimagesの中に適当な画像のデータを保存する(今回はa.pngと言う名前の画像を用意します)
今このような状態
public/images/a.png
a.pngは適当な画像のデータです
次にそのデータを参照したいのでfactoriesディレクトリの中にあるテンプレートの中にimageカラムを作成します今回私は「item」と言うモデルをテストするのでractories/items.rbになります
FactoryBot.define do
factory :item do
name {"名前"}
price {500}
text {"テスト"}
judgement_id {1}
category_id {1}
prefecture_id {2}
day_id {1}
status_id {1}
user #userとのアソシエーション
after(:build) do |message|
message.image.attach(io: File.open('public/images/a.png'), filename: 'a.png')
end
end
end
ゆるく解説
・judgement_idやcategory_idなどの「_id」の項目はactivehashを使って導入したので無視して大丈夫です。
・userと言う記述はuserモデルとのアソシエーションを意味してます、これを記述することでuser_idを入力しなくてすみます。
今回の注目していただきたいのはuserの下にある記述です
after(:build) do |message|
message.image.attach(io: File.open('public/images/a.png'), filename: 'a.png')
end
この記述により実際に存在する写真を参照するようになります。
ダメな例
FactoryBot.define do
factory :item do
name {"名前"}
price {500}
text {"テスト"}
judgement_id {1}
category_id {1}
prefecture_id {2}
day_id {1}
status_id {1}
image {"a.png"} #ダメな例です
user
end
end
こうしてしまうと、文字列しか登録できていないため、エラーになりますちなみにエラー内容は以下になります。
エラーを確かめたい場合はbinding.pryを記述して処理を止めましょう!
[1] pry(#<RSpec::ExampleGroups::Item>)> @item.valid?
ActiveSupport::MessageVerifier::InvalidSignature: ActiveSupport::MessageVerifier::InvalidSignature
同じエラーに出会した方の参考になれば幸いです。