4

在 Rails 应用程序中,我使用 FactoryGirl 来定义一个通用工厂以及几个更具体的特征。一般情况和除一个特征之外的所有特征都有特定的关联,但我想定义一个特征,其中没有创建/构建该关联。我可以使用after回调将关联设置idnil,但这并不会阻止关联记录的创建。

特征定义中有没有办法完全禁用为特征所属的工厂定义的关联的创建/构建?

例如:

FactoryGirl.define do
  factory :foo do
    attribute "value"
    association :bar

    trait :one do
      # This has the bar association
    end

    trait :two do
      association :bar, turn_off_somehow: true
      # foos created with trait :two will have bar_id = nil
      # and an associated bar will never be created
    end
  end
end
4

2 回答 2

5

factory_girl 中的关联只是与其他任何属性一样的属性。使用association :bar设置bar属性,因此您可以通过覆盖它来禁用它nil

FactoryGirl.define do
  factory :foo do
    attribute "value"
    association :bar

    trait :one do
      # This has the bar association
    end

    trait :two do
      bar nil
    end
  end
end
于 2013-12-05T17:49:54.257 回答
2

我尝试了@Joe Ferris 的回答,但似乎它在 factory_bot 5.0.0 中不再起作用。我发现这个 相关的问题提到了strategy: :null可以传递给协会的标志,例如:

FactoryGirl.define do
  factory :foo do
    attribute "value"
    association :bar

    trait :one do
      # This has the bar association
    end

    trait :two do
      association :bar, strategy: :null
    end
  end
end

现在似乎可以解决问题了。

源代码看起来就像它只是停止任何回调,如创建或构建,因此将关联呈现为空。

module FactoryBot
  module Strategy
    class Null
      def association(runner); end

      def result(evaluation); end
    end
  end
end
于 2019-02-13T22:44:49.177 回答