FactoryBotRails 工厂中的循环依赖

问题描述 投票:0回答:1

规格/工厂/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

规格/工厂/company.rb

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

应用程序/模型/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

应用程序/模型/user.rb

class User < ApplicationRecord
  belongs_to :company
end

当我尝试制作

:company
时,它会抛出
SystemStackError (stack level too deep)

因为我们已验证为该公司创建至少一个用户,并且用户需要公司。我们遇到了循环依赖问题。

我尝试了这个解决方案,但这似乎并不能解决问题。或者我不确定如何正确执行此操作(如何避免在factory_girl中循环创建关联模型?

我尝试使用

transient
但我不确定如何为 has_many 关联配置它。请有人帮我解决这个问题

ruby-on-rails rspec factory-bot
1个回答
4
投票

这是循环依赖:

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
创建新用户,同时验证公司工厂。

如果您想添加关联,我个人建议您在示例中添加关联,而不是在工厂中添加。由于工厂旨在在您的整个项目中使用,并且有些测试不会与您今天测试的逻辑相同,事实上,这可能迟早会改变。

© www.soinside.com 2019 - 2024. All rights reserved.