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

#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

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

最佳答案 我不知道有一个明确支持这个的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

(traits中的回调在工厂中相应的回调之前运行,所以如果你在回调中注意到一个特征,你最早可以看到它在之前:create.)如果你想追踪特征,那么这可能比第一种方法更好.很多工厂,这会使每个特性的瞬态属性更加痛苦.

点赞