FactoryBotRails 工厂中的循环依赖
Circular depenedancy in FactoryBotRails Factories
spec/factories/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/factories/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)
。
因为我们已经验证了为公司创建至少一个用户并且用户需要公司。我们遇到了循环依赖问题。
我试过这个解决方案,但似乎没有解决问题。或者我不确定如何正确操作 ( )
我尝试使用 transient
,但我不确定如何为 has_many 关联配置它。请有人帮我解决这个问题
这是循环依赖:
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
创建一个新用户,同时正在验证公司工厂。
如果您想添加关联,我个人建议您在示例中而不是在工厂中进行。由于工厂是要在您的整个项目中使用的,并且有些测试不会与您今天测试的逻辑相同,事实上,这可能迟早会改变。
spec/factories/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/factories/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)
。
因为我们已经验证了为公司创建至少一个用户并且用户需要公司。我们遇到了循环依赖问题。
我试过这个解决方案,但似乎没有解决问题。或者我不确定如何正确操作 (
我尝试使用 transient
,但我不确定如何为 has_many 关联配置它。请有人帮我解决这个问题
这是循环依赖:
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
创建一个新用户,同时正在验证公司工厂。
如果您想添加关联,我个人建议您在示例中而不是在工厂中进行。由于工厂是要在您的整个项目中使用的,并且有些测试不会与您今天测试的逻辑相同,事实上,这可能迟早会改变。