Rails FactoryGirl实例变量

时间:2016-07-14 12:52:33

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

我想使用局部变量创建工厂。 目前我有以下工厂:

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工厂位于其他分隔文件中。

1 个答案:

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