FactoryGirl - 覆盖深层相关对象属性

时间:2016-01-13 09:22:45

标签: ruby-on-rails ruby factory-bot

我对工厂有一些不太常见的问题。我有几个相互关联的模型。我创造了一个非常好的工厂,创造了整个"链#34;仅在

下面调用
FactoryGirl.create(:application)

上面的命令就像我之前提到的几个相关模型一样。我使用Faker填充属性'名。一切正常,但是,我想覆盖一个名为“服务”的深度相关模型。与应用程序模型。我想到了特质,但我不能在

中调用这个特性
trait :my_trait do
  name 'Overwritten name'
end

FactoryGirl.create(:application, :my_trait)

显然上面是错误的,因为trait关注应用程序而不是嵌套服务模型。我找到的一个解决方案是在创建工厂后更新它,但我更愿意在全局范围内更新。

1 个答案:

答案 0 :(得分:1)

在这些情况下,我们通常会创建一个单独的“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