はじめに
rspecでのテスト中にRSpec::Expectations::ExpectationNotMetError:
のエラーが
発生しました。
めちゃくちゃ凡ミスでした。二度としないように備忘録に残しておきます!!!
※Rspec
、FactoryBot
は導入済みの状態で始まります。
エラー紹介
bundle exec rspec spec/models/item_spec.rb
実行時に
RSpec::Expectations::ExpectationNotMetError: expected #<Item id: nil, title: "商品名", price: 50000, concept: "説明文", category_id: 1, condition_id: 1, postage_payer_id: 1, ship_area_id: 1, ship_date_id: 1, user_id: nil, created_at: nil, updated_at: nil> to be valid, but got errors: Category can't be blank, Condition can't be blank, Postage payer can't be blank, Ship area can't be blank, Ship date can't be blank
と上記のエラー文が発生しました。
パラメーターで情報を送ることはできているが
but got errors:
以降の文を確認すると
Category can't be blank, Condition can't be blank, Postage payer can't be blank, Ship area can't be blank, Ship date can't be blank
とバリデーションでデータが弾き出されているとエラーが表示されている・・・
↓以下実装コード
ruby models/item.rb
class Item < ApplicationRecord
validates :title, presence: true
validates :price, presence: true, numericality: { greater_than_or_equal_to: 300, less_than_or_equal_to: 9999999, message: "Out of setting range" }
validates :price, numericality: { only_integer: true, message: "Half-width number."}
validates :concept, presence: true
validates :image, presence: true
validates :category_id, numericality: { other_than: 1 , message: "can't be blank" }
validates :condition_id, numericality: { other_than: 1 , message: "can't be blank" }
validates :postage_payer_id, numericality: { other_than: 1 , message: "can't be blank" }
validates :ship_area_id, numericality: { other_than: 1 , message: "can't be blank" }
validates :ship_date_id, numericality: { other_than: 1 , message: "can't be blank" }
belongs_to :user
has_one_attached :image
extend ActiveHash::Associations::ActiveRecordExtensions
belongs_to :category
belongs_to :condition
belongs_to :postagepayer, optional: true
belongs_to :shiparea, optional: true
belongs_to :shipdate, optional: true
end
ruby factories/items.rb
FactoryBot.define do
factory :item do
title { '商品名' }
price { '50000' }
concept { '説明文' }
category_id { '1' }
condition_id { '1' }
postage_payer_id { '1' }
ship_area_id { '1' }
ship_date_id { '1' }
association :user
after(:build) do |item|
item.image.attach(io: File.open('public/images/test_image.png'), filename: 'test_image.png')
end
end
end
解説
ruby models/item.rb
validates :category_id, numericality: { other_than: 1 , message: "can't be blank" }
validates :condition_id, numericality: { other_than: 1 , message: "can't be blank" }
validates :postage_payer_id, numericality: { other_than: 1 , message: "can't be blank" }
validates :ship_area_id, numericality: { other_than: 1 , message: "can't be blank" }
validates :ship_date_id, numericality: { other_than: 1 , message: "can't be blank" }
で id1 意外で登録するように設定しているのに
FactoryBot
作成時に
仮の数字を 1 で入力しているという初歩中の初歩のミスを犯してました・・・泣
ruby factories/items.rb
FactoryBot.define do
factory :item do
title { '商品名' }
price { '50000' }
concept { '説明文' }
category_id { '2' }
condition_id { '2' }
postage_payer_id { '2' }
ship_area_id { '2' }
ship_date_id { '2' }
association :user
after(:build) do |item|
item.image.attach(io: File.open('public/images/test_image.png'), filename: 'test_image.png')
end
end
end
以上 1→2に 修正することで無事解決しました。
解決に2時間ほどかかってしまいました。。。