禁用特征内的FactoryGirl关联

时间:2013-11-08 18:02:29

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

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

特征定义中是否有一种方法可以完全禁用为特征属于工厂定义的关联的创建/构建?

例如:

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

我尝试了@Joe Ferris的答案,但似乎在factory_bot 5.0.0中不再起作用。我发现这个related question引用了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

现在看来可以解决问题了。

Source code看起来像只是停止了诸如create或build之类的任何回调,因此使关联不显示任何内容。

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

      def result(evaluation); end
    end
  end
end