RSpec単体テストコードのときたまにこのようなエラーを起こしてしまうことがある。
ターミナル
Failures:
1) ShippingAddress 配送先の情報として、郵便番号が必須であること
Failure/Error: expect(@userpurchases.errors.full_messages). to include ("Post code can't be blank")
expected [] to include "Post code can't be blank"
# ./spec/models/shipping_address_spec.rb:12:in `block (2 levels) in <top (required)>'
2) ShippingAddress 配送先の情報として、都道府県が必須であること
Failure/Error: expect(@userpurchases.errors.full_messages). to include ("Prefecture_id can't be blank")
expected [] to include "Prefecture_id can't be blank"
# ./spec/models/shipping_address_spec.rb:18:in `block (2 levels) in <top (required)>'
3) ShippingAddress 配送先の情報として、市区町村が必須であること
Failure/Error: expect(@userpurchases.errors.full_messages). to include ("Municipality can't be blank")
expected [] to include "Municipality can't be blank"
# ./spec/models/shipping_address_spec.rb:23:in `block (2 levels) in <top (required)>'
4) ShippingAddress 配送先の情報として、番地が必須であること
Failure/Error: expect(@userpurchases.errors.full_messages). to include ("Address can't be blank")
expected [] to include "Address can't be blank"
# ./spec/models/shipping_address_spec.rb:28:in `block (2 levels) in <top (required)>'
5) ShippingAddress 配送先の情報として、電話番号が必須であること
Failure/Error: expect(@userpurchases.errors.full_messages). to include ("Phone_number can't be blank")
expected [] to include "Phone_number can't be blank"
# ./spec/models/shipping_address_spec.rb:33:in `block (2 levels) in <top (required)>'
expected[]to includeというエラーが出ており要するにうまくデータを持ってこれていない。
原因としてはdescribeの記述や各exampleのモデル名が間違っている可能性がある。
単体テストコードはモデルファイルのバリデーションがうまく機能しているかどうかのテストなのでモデルファイルと同じ記述にする必要がある。
RSpec.describe UserPurchases, type: :model do
before do
@user_purchases = FactoryBot.build(:user_purchases)
end
it '配送先の情報として、郵便番号が必須であること' do
@user_purchases.post_code = nil
@user_purchases.valid?
expect(@user_purchases.errors.full_messages). to include ("Post code can't be blank")
end
it '配送先の情報として、都道府県が必須であること' do
@user_purchases.prefecture_id = 0
@user_purchases.valid?
expect(@user_purchases.errors.full_messages). to include ("Address is invalid. Include hyphen(-)")
end
it '配送先の情報として、市区町村が必須であること' do
@user_purchases.municipality = nil
@user_purchases.valid?
expect(@user_purchases.errors.full_messages). to include ("Municipality can't be blank")
end
it '配送先の情報として、番地が必須であること' do
@user_purchases.address = nil
@user_purchases.valid?
expect(@user_purchases.errors.full_messages). to include ("Address can't be blank")
end
it '配送先の情報として、電話番号が必須であること' do
@user_purchases.phone_number = nil
@user_purchases.valid?
expect(@user_purchases.errors.full_messages). to include ( "Phone number can't be blank")
この場合テストしたいモデルファイル名はuser_purchases.rbなので
RSpec.describe UserPurchasesとし、
モデル名を@user_purchasesに変更した。
データを取れていない場合は大抵このような理由が多いようだ。