在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
答案 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