Как указать связь с factory_bot? - PullRequest
0 голосов
/ 27 апреля 2018

Например, у меня есть две модели: пользователь и пост. Сообщение принадлежит пользователю, а у пользователя много сообщений

#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?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Другой вариант - использовать метод #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)
0 голосов
/ 04 мая 2018

Вы должны использовать 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

...