2015-07-11 86 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!深度調試幫助了我。