0
0

More than 3 years have passed since last update.

FactoryBotを用いて紐づいたユーザーの登録

Posted at

User:Hotel = 1:多

Hotelインスタンスは生成時にUserのIDがないと作成できません。
そのため、user_idを直接書き込んで登録しようとしましたが、エラーになりました。

上手くいかない原因は、紐付く親が存在していないからではないかと以下の記事のコメント欄には書いてありました。
rspecでエラーが出ます

誤った書き方

# spec/factories/hotels.rb
FactoryBot.define do
  factory :hotel do
    user_id {1}  
    name {"ホテル名"}
    address1 {"東京都"}
    address2 {"千代田区XXX町X-X-X"}
  end
end
# spec/models/hotel_spec.rb
require 'rails_helper'

RSpec.describe Hotel, type: :model do
  describe "ホテル" do
    context "保存" do
      it "正しく登録" do
        hotel = FactoryBot.build(:hotel)
        expect(hotel).to be_valid
      end
    end
  end
end

解決方法

user_idを登録する際に、Userモデルを作成した際のFactoryBotを活用

# spec/factories/users.rb
FactoryBot.define do
  factory :user_bob, class: "User" do
    name {"bob"}
    email {"bob@sample.com"}
    password {"sample"}
    password_confirmation {"sample"}
  end
end

解決1

user_idの登録時に、userインスタンスの作成

# spec/factories/hotels.rb
FactoryBot.define do
  factory :hotel do
    user_id { FactoryBot.create(:user_bob).id }
    name {"ホテル名"}
    address1 {"東京都"}
    address2 {"千代田区XXX町X-X-X"}
  end

解決2

associationを使用する。

# spec/factories/hotels.rb
FactoryBot.define do
  factory :hotel do
    # factory名はmodel名と同一の場合、省略可
    association :user, factory: :user_bob
    name {"ホテル名"}
    address1 {"東京都"}
    address2 {"千代田区XXX町X-X-X"}
  end

参考記事

Rspecのmodelテストで、user_id: nil, post_id: nilになってしまう。

0
0
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
0