たとえば、ユーザーと投稿の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でオブジェクトを作成するときに、関連付けをどのように指定できますか?
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
別のオプションは、親内で#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)
(フィクスチャのように)共有レコードは、テストレコードを互いに分離しなかったため、予期しない動作が発生しました。これはテストには適していません。
FactoryBotは(Rspecのように)独立したテストをサポートするようになりました
それでも良いと思われる場合は、以下を選択できます。
FactoryBot
に加えて_Rails Fixtures
_を調整しますuser { User.first || create(:user) }
を使用しますuser = post.user
_を使用(私はしばしばこれを達成するために_user = post.user
_を使用します)