#ruby #rspec #factory-bot
#ruby #rspec #factory-бот
Вопрос:
#spec
let(:price) { create :price,:some_trait,:my_trait }
#factory
FactoryGirl.define do
factory :price, class: 'Prices::Price' do
...
after(:build) do |p,e|
# How I can get the traits passed to the create method?
# => [:some_trait,:my_trait]
if called_traits_does_not_include(:my_trait) # fake code
build :price_cost,:order_from, price:p
end
end
...
end
end
Как я могу получить признаки, которые передаются create
при after(:build)
обратном вызове factory?
Ответ №1:
Я не знаю функции factory_girl, которая явно поддерживает это. Но я могу придумать два частичных решения, которые могут сработать в конкретных случаях:
-
Установите временный атрибут в черте:
trait :my_trait do using_my_trait end factory :price do transient do using_my_trait false end after :build do |_, evaluator| if evaluator.using_my_trait # Do stuff end end end
Этот метод требует временного атрибута для каждого признака, который вы хотите отслеживать.
-
Если вам не нужно знать, какие признаки использовались при
after :build
обратном вызове, но вы хотите отслеживать несколько признаков без добавления временного атрибута для каждого, добавьте признак в список приafter :build
обратном вызове в черте:trait :my_trait do after :build do |_, evaluator| evaluator.traits << :my_trait end end factory :price do transient do traits [] end before :create do |_, evaluator| if evaluator.traits.include? :my_trait # Do stuff end end end
(Обратные вызовы в признаках выполняются перед соответствующими обратными вызовами на фабриках, поэтому, если вы заметили признак в его обратном вызове, вы можете увидеть его раньше
before :create
.) Это может быть лучше, чем первый метод, если вы хотите отслеживать признаки на множестве фабрик, что сделало бы добавление временного атрибута для каждого признака более болезненным.