LoginSignup
0
1

More than 3 years have passed since last update.

RSpec単体テストコードのexpected [] to includeの解決方法

Posted at

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に変更した。
データを取れていない場合は大抵このような理由が多いようだ。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1