3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

FactoryBot、外部キーバリデーションで弾かれたときの解決方法

Last updated at Posted at 2020-12-27

#はじめに
 以前から、FactoryBotを使って、Rspecのテストがエラーでなかなか進めませんでした。今回、解決出来たので紹介します。

↓以前の投稿
FactoryBotで外部キーの値はどうやって作り出すんだ〜(泣

##設計

userテーブルはroomテーブルとアソシエーションしていて、ユーザー登録をする際に、room_idを入力する必要があるような状況です。

##ユーザー登録のテストコード一部

user_spec.rb
RSpec.describe User, type: :model do
  describe 'ユーザー登録' do
    before do
      @user = FactoryBot.build(:user)
    end
    it '全ての項目が入力されていれば、登録できること' do
      expect(@user).to be_valid
    end
  end
end

@user = FactoryBot.build(:user)の部分でいつもエラーが出てしまっていた。

##FactoryBotの一部

###roomモデル

rooms.rb
FactoryBot.define do
  factory :room do
    Faker::Config.locale = :ja
    name { Faker::Name.first_name }
  end
end

###userモデル

users.rb
FactoryBot.define do
  factory :user do
    Faker::Config.locale = :ja
    room { FactoryBot.create(:room) } #元々のエラーの原因はここ
    email { Faker::Internet.free_email }
    nickname { Faker::Name.last_name }
    password = Faker::Internet.password(min_length: 6)
    password { password }
    password_confirmation { password }
  end
end

##Rspecのエラーだった原因

ずばり、この部分です。


room { FactoryBot.create(:room) }(修正後)
room_id { 1 }(修正前)

外部キーにしていたroom_idを無理やり、「1」という値を入れて、FactoryBotとして生成させようとしていました。しかし、これでは、バリデーションのエラーが出てしまっていました。エラーを解釈すると、「外部キーが見当たらない」みたいな感じです。

##解決方法

  • 外部キーのカラムには
    FactoryBotの中に、FactoryBotを打ち込む!!
  • 細かい点ではあるが、
    _idは記述しない。

##最後に
 これで、やっとテストコードを進めていくことができます。久しぶりに、がっつり知識が増えました!

3
4
1

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
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?