Переменная экземпляра 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