【问题标题】:FactoryGirl - overwrite deep related object attributeFactoryGirl - 覆盖深度相关的对象属性
【发布时间】:2016-01-13 09:22:44
【问题描述】:

我对工厂有一些不太常见的问题。我有几个相互关联的模型。我创建了一个非常好的工厂,它创建了整个“链”,只在下面调用

FactoryGirl.create(:application)

上面的命令创建就像我之前提到的几个相关模型一样。我使用 Faker 来填充属性的名称。一切正常,但是,我想用应用程序模型覆盖一个名为“服务”的深层相关模型。我考虑过特质,但我无法在

中调用该特质
trait :my_trait do
  name 'Overwritten name'
end

FactoryGirl.create(:application, :my_trait)

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

【问题讨论】:

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


    【解决方案1】:

    在这些情况下,我们通常会创建一个单独的“下层”实例并将其传递给“上层”实例。

    喜欢:

    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
    

    【讨论】:

    • 应用程序没有服务,就像我提到的那样,它是通过多个模型关联的。这只是我的问题。
    • 那么您还需要创建“中间”实例或使用第二个示例。
    • 回调并忽略声明,这正是我想要的!非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2021-06-20
    • 2017-11-27
    相关资源
    最近更新 更多