如何获取传递给 factory_girl 方法的特征列表?

ole*_*ole 5 ruby rspec factory-bot

#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
Run Code Online (Sandbox Code Playgroud)

我如何获得create在工厂after(:build)回调中传递的特征?

Dav*_*uth 3

我不知道有一个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
    
    Run Code Online (Sandbox Code Playgroud)

    此方法需要您要跟踪的每个特征的瞬态属性。

  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
    
    Run Code Online (Sandbox Code Playgroud)

    (特征中的回调在工厂中相应的回调之前运行,因此如果您最早在其回调中注意到某个特征,您可以看到它位于 中before :create。)如果您想跟踪许多工厂中的特征,这可能比第一种方法更好,这会让为每个特征添加瞬态属性变得更加痛苦。