web-dev-qa-db-ja.com

factory_botとの関連付けを指定するにはどうすればよいですか?

たとえば、ユーザーと投稿の2つのモデルがあります。投稿がユーザーに属しており、ユーザーが多数の投稿を持っている

#spec/factories/post.rb
FactoryBot.define do
  factory :post do
    user
    body Faker::Movie.quote
    posted_at "2018-04-03 13:33:05"
  end
end

#spec/factories/user.rb
FactoryBot.define do 
  factory :user do 
    first_name 'Jake'
  end
end

Rspecをテストで使用して、これを実行します。

user = create(:user, first_name: 'Barry') #id 1
post = create(:post, user: user)

投稿のuser_idは1であると予想しますが、前に別のユーザーを作成しており、user_idは2です。

Factory_bot/factory_girlでオブジェクトを作成するときに、関連付けをどのように指定できますか?

12
Jake McAllister

explicitの関連付けの代わりにimplicitの関連付けを使用する必要があります。

#spec/factories/post.rb
FactoryBot.define do
  factory :post do
    association :user    # <<<--- here the change
    body Faker::Movie.quote
    posted_at "2018-04-03 13:33:05"
  end
end

#spec/factories/user.rb
FactoryBot.define do 
  factory :user do 
    first_name 'Jake'
  end
end

https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md

16
Fran Martinez

別のオプションは、親内で#traitメソッドを使用することです。

FactoryBot.define do
  factory :post do
    user nil
    body Faker::Movie.quote
    posted_at "2018-04-03 13:33:05"
  end
end

FactoryBot.define do 
  factory :user do 
    first_name 'Jake'
  end

  trait :with_post do
    after(:create) do |user|
      create(:post, user_id: user.id)
    end
  end
end

FactoryBot.create(:user, :with_post)
1
andriy-baran

(フィクスチャのように)共有レコードは、テストレコードを互いに分離しなかったため、予期しない動作が発生しました。これはテストには適していません。

FactoryBotは(Rspecのように)独立したテストをサポートするようになりました

それでも良いと思われる場合は、以下を選択できます。

  • FactoryBotに加えて_Rails Fixtures_を調整します
  • user { User.first || create(:user) }を使用します
  • _user = post.user_を使用

(私はしばしばこれを達成するために_user = post.user_を使用します)

0
itsnikolay