2015-07-11 3 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, если имя ==: корзина'. –

ответ

0

Проблема заключалась в том, что я вызывал campaign_trait количество раз через множество тестов и как-то (я не знаю почему), callback_attrs разделяются между тестами. И method_name = arg.shift ломает мой код, изменяя callback_attrs.

Спасибо, BroiSatse! Глубокая отладка помогла мне.

Смежные вопросы