FactoryGirl 中带有块的多个参数
Multiple arguments with block in FactoryGirl
我在spec\factories\campaigns.rb
中有一个方法:
def campaign_trait(name, *callback_attrs, &block)
trait name do
association :campaign_type, factory: [:campaign_type, name]
after(:build) do |campaign, evaluator|
eval_str = ""
callback_attrs.each do |arg|
arg = [arg] unless arg.is_a? Array
method_name = arg.shift
method_args = arg
method_name = "add_#{method_name}" unless respond_to? method_name
eval_str << method_name.to_s
eval_str << "(campaign"
eval_str << ", evaluator" if method_name == "add_campaign_scopes"
if method_args.any?
method_args.map! { |i| i.is_a?(Symbol) ? ":#{i}" : i }
eval_str << ", " << method_args.map(&:to_s).join(', ')
end
eval_str << ")\n"
end
eval eval_str
end
yield(block) if block_given?
end
end
我这里叫它:
FactoryGirl.define do
campaign_trait :basket, :campaign_scopes, [:banner, :basket] do
initialize_with { Campaigns::Basket.new(attributes, without_protection: true) }
emitent_article 'emitent'
emitent_name 'Emitent'
end
end
我面临的问题是,在方法 campaign_trait
中,我得到的 callback_attrs
等于 [:campaign_scopes, []]
而不是预期的 [:campaign_scopes, [:banner, :basket]]
。
如果我在没有阻塞的情况下调用 campaign_trait
,一切正常,我得到了预期的 [:campaign_scopes, [:banner, :basket]]
。
你能帮帮我吗?
问题是我通过多次测试调用了 campaign_trait
次,不知何故(我不知道为什么),callback_attrs 在测试之间共享。 method_name = arg.shift
破坏了我的代码修改 callback_attrs.
谢谢,BroiSatse!深度调试帮助了我。
我在spec\factories\campaigns.rb
中有一个方法:
def campaign_trait(name, *callback_attrs, &block)
trait name do
association :campaign_type, factory: [:campaign_type, name]
after(:build) do |campaign, evaluator|
eval_str = ""
callback_attrs.each do |arg|
arg = [arg] unless arg.is_a? Array
method_name = arg.shift
method_args = arg
method_name = "add_#{method_name}" unless respond_to? method_name
eval_str << method_name.to_s
eval_str << "(campaign"
eval_str << ", evaluator" if method_name == "add_campaign_scopes"
if method_args.any?
method_args.map! { |i| i.is_a?(Symbol) ? ":#{i}" : i }
eval_str << ", " << method_args.map(&:to_s).join(', ')
end
eval_str << ")\n"
end
eval eval_str
end
yield(block) if block_given?
end
end
我这里叫它:
FactoryGirl.define do
campaign_trait :basket, :campaign_scopes, [:banner, :basket] do
initialize_with { Campaigns::Basket.new(attributes, without_protection: true) }
emitent_article 'emitent'
emitent_name 'Emitent'
end
end
我面临的问题是,在方法 campaign_trait
中,我得到的 callback_attrs
等于 [:campaign_scopes, []]
而不是预期的 [:campaign_scopes, [:banner, :basket]]
。
如果我在没有阻塞的情况下调用 campaign_trait
,一切正常,我得到了预期的 [:campaign_scopes, [:banner, :basket]]
。
你能帮帮我吗?
问题是我通过多次测试调用了 campaign_trait
次,不知何故(我不知道为什么),callback_attrs 在测试之间共享。 method_name = arg.shift
破坏了我的代码修改 callback_attrs.
谢谢,BroiSatse!深度调试帮助了我。