我想使用局部变量创建工厂。 目前我有以下工厂:
FactoryGirl.define do
factory :offer_item, class: BackOffice::OfferItem do
service
variant
end
end
我的期望是创建类似下面的内容
FactoryGirl.define do
variant = FactroyGirl.create(:variant)
factory :offer_item, class: BackOffice::OfferItem do
service
variant { variant }
after(:create) do |offer_item|
offer_item.service.variants << variant
end
end
end
然后我得到:
/.rvm/gems/ruby-2.2.3/gems/factory_girl-4.7.0/lib/factory_girl/registry.rb:24:in `find': Factory not registered: variant (ArgumentError)
所有模型都嵌套在BackOffice
模块中。通常我希望同一个对象与另外两个对象有关联。我认为我的工厂范围存在一些问题。
Variant工厂位于其他分隔文件中。
答案 0 :(得分:2)
问题是您在FactoryGirl完成加载所有工厂定义之前尝试创建工厂。这是因为您在工厂定义的范围内定义了变量。即使这确实有效,您最终可能会在测试中创建的多个offer_items
之间共享相同的变体记录,因为此代码只会在初始化期间执行一次。
由于您定义了与Variant
的关联,因此您可能不需要将其创建为额外步骤。我们可以利用FactoryGirl为我们创建关联的能力,然后将对象复制到#service
回调中的after(:create)
。也许它看起来像这样(未经测试):
FactoryGirl.define do
factory :offer_item, class: BackOffice::OfferItem do
service
variant
after(:create) do |offer_item|
offer_item.service.variants << offer_item.variant
end
end
end