Как получить список признаков, переданных методу factory_girl?

#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, которая явно поддерживает это. Но я могу придумать два частичных решения, которые могут сработать в конкретных случаях:

  1. Установите временный атрибут в черте:

     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
      

    Этот метод требует временного атрибута для каждого признака, который вы хотите отслеживать.

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