Переменная экземпляра Rails FactoryGirl

Я хотел бы создать фабрику с использованием локальной переменной. В настоящее время у меня есть следующий завод:

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 модуль. Как правило, я хочу, чтобы один и тот же объект был связан с двумя другими объектами. Я думаю, что есть какая-то проблема с областью применения на моей фабрике.

Вариант фабрики находится внутри другого отдельного файла.

1 ответ

Решение

Проблема в том, что вы пытаетесь создать фабрику до того, как 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
Другие вопросы по тегам