2015-07-11 52 views
0

块多参数我有spec\factories\campaigns.rb的方法:在FactoryGirl

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]]

你能帮我吗?

+1

无法重现。你是如何检查'callback_attrs'的值的? – BroiSatse

+0

它是代码的一部分。当然,你将无法复制。 =) 通过'p callback_attrs if name ==:basket'。 –

回答

0

问题是我通过多次测试呼叫campaign_trait次数并以某种方式(我不知道为什么),callback_attrs在测试之间共享。并method_name = arg.shift打破我的代码修改callback_attrs。

谢谢,BroiSatse!深度调试帮助了我。