#はじめに
以前から、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
は記述しない。
##最後に
これで、やっとテストコードを進めていくことができます。久しぶりに、がっつり知識が増えました!