Круговая зависимость на фабриках FactoryBotRails - PullRequest
1 голос
/ 15 апреля 2020

spec / factory / company.rb

FactoryBot.define do
  factory :company do
    name { Faker::Name.unique.name }
    time_zone_name { Faker::Address.time_zone }
    users { [ FactoryBot.create(:user) ]  }  
  end
end

spec / factory / company.rb

FactoryBot.define do
  factory :user do
    email { Faker::Internet.email }
    password {'123qwe123'}
    name { Faker::Superhero::name }
    association :company, factory: :company
  end
end

app / model / company.rb

class Company < ApplicationRecord


  validate :check_users_present?
  has_many :users

  private    
  def check_users_present?
    errors.add(:base, "You must provide at least one user") if users.size < 1
  end

end

app / model / user.rb

class User < ApplicationRecord
  belongs_to :company
end

, когда я пытаюсь сделать :company он выбрасывает SystemStackError (stack level too deep).

, поскольку у нас есть проверка для создания хотя бы одного пользователя с компанией, и пользователю требуется компания. у нас проблема с циклической зависимостью.

Я пробовал это решение, но, похоже, это не исправляет. или я не уверен, как это сделать правильно ( Как избежать циклического создания связанных моделей в factory_girl? )

я пытался использовать transient, но я не уверен, как его настроить для has_many ассоциаций. пожалуйста, может кто-нибудь помочь мне разобраться в этом

1 Ответ

3 голосов
/ 15 апреля 2020

Вот круговая зависимость:

FactoryBot.define do
  factory :company do
    ...
    users { [ FactoryBot.create(:user) ]  } # HERE
  end
end

FactoryBot.define do
  factory :user do
    ...
    association :company, factory: :company # AND HERE
  end
end

При попытке создать компанию с помощью FactoryGirl он вызывает FactoryBot.create для создания нового пользователя, который одновременно проверяет фабрику компании.

Если вы хотите добавить ассоциации, я бы лично советовал вам делать это на ваших примерах, а не на фабриках. Поскольку фабрики предназначены для использования во всех ваших проектах, и существуют тесты, которые не будут использовать тот же лог c, который вы тестируете сегодня, на самом деле, они могут рано или поздно измениться.

...