FactoryGirl - 覆盖深度相关的对象属性
FactoryGirl - overwrite deep related object attribute
我有一些与工厂不太常见的问题。我有几个相互关联的模型。我创建了非常好的工厂,它创建了整个 "chain" 仅在
以下调用
FactoryGirl.create(:application)
上面的命令创建了我之前提到的几个相关模型。我使用 Faker 来填充属性的名称。一切正常,但我想用应用程序模型覆盖一个名为 'service' 的深度相关模型。我考虑过特征,但我无法在
中调用该特征
trait :my_trait do
name 'Overwritten name'
end
FactoryGirl.create(:application, :my_trait)
显然以上是错误的,因为 trait 是针对应用程序而不是嵌套服务模型的。我发现的一种解决方案是在创建工厂后对其进行更新,但我更愿意在全球范围内进行更新。
在这些情况下,我们通常创建一个单独的 "lower" 实例并将其传递给 "upper" 实例。
喜欢:
service = FactoryGirl.build(:service, name: 'Something else')
application = FactoryGirl.create(:application, service: service)
当然,如果您在带有以下工厂的代码库中大量使用此模式,您当然也可以实现相同的行为:
factory :application do
transient do
service_name nil
end
association :service
after(:build) do |application, evaluator|
if evaluator.service_name
application.service.name = evaluator.service_name
end
end
end
我有一些与工厂不太常见的问题。我有几个相互关联的模型。我创建了非常好的工厂,它创建了整个 "chain" 仅在
以下调用FactoryGirl.create(:application)
上面的命令创建了我之前提到的几个相关模型。我使用 Faker 来填充属性的名称。一切正常,但我想用应用程序模型覆盖一个名为 'service' 的深度相关模型。我考虑过特征,但我无法在
中调用该特征trait :my_trait do
name 'Overwritten name'
end
FactoryGirl.create(:application, :my_trait)
显然以上是错误的,因为 trait 是针对应用程序而不是嵌套服务模型的。我发现的一种解决方案是在创建工厂后对其进行更新,但我更愿意在全球范围内进行更新。
在这些情况下,我们通常创建一个单独的 "lower" 实例并将其传递给 "upper" 实例。
喜欢:
service = FactoryGirl.build(:service, name: 'Something else')
application = FactoryGirl.create(:application, service: service)
当然,如果您在带有以下工厂的代码库中大量使用此模式,您当然也可以实现相同的行为:
factory :application do
transient do
service_name nil
end
association :service
after(:build) do |application, evaluator|
if evaluator.service_name
application.service.name = evaluator.service_name
end
end
end