#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)
的特征?
答案 0 :(得分:2)
我不知道有一个明确支持此功能的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中的回调在工厂中相应的回调之前运行,所以如果你在回调中注意到一个特征,你最早可以看到它在before :create
。)这可能比第一种方法好,如果你想要的话跟踪很多工厂的特征,这会使每个特征的瞬态属性更加痛苦。