为什么这个带initialize_with的工厂会导致FactoryGirl :: SyntaxRunner错误?

时间:2014-08-22 06:59:21

标签: ruby-on-rails ruby rspec ruby-on-rails-3.2 factory-bot

FactoryGirl.define do 
  factory :costs_estimator do 
    ignore do 
      detailed_outcome_estimate nil
      finance_estimate { detailed_outcome_estimate.try(:finance_estimate) }
      task_estimators do 
        if detailed_outcome_estimate.present?
          [ build(:task_estimator) ]
        end
      end
     end
   end

  initialize_with do 
    new(finance_estimate, task_estimators)
  end
end

我使用初始化程序构建了一个名为costs_estimator的模型,我为它添加了上面的工厂。现在的问题是,当我运行RSpec时,其他测试报告错误:

factory_girl-4.2.0/lib/factory_girl/evaluator.rb:42:in `method_missing':
  undefined method `finance_estimate' for #<FactoryGirl::SyntaxRunner:0x00000009c542a8>
  (NoMethodError)...

有没有人知道这家工厂发生了什么以及为什么它会影响其他测试?如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:2)

您可能希望initialize_with仅适用于:costs_estimator工厂。如果是这样,请将其移到该定义中:

FactoryGirl.define do 
  factory :costs_estimator do 
    ignore do 
      detailed_outcome_estimate nil
      finance_estimate { detailed_outcome_estimate.try(:finance_estimate) }
      task_estimators do 
        if detailed_outcome_estimate.present?
          [ build(:task_estimator) ]
        end
      end
    end

    initialize_with do 
      new(finance_estimate, task_estimators)
    end

  end    
end

factory_girl确实允许你在顶层定义initialize_with,在这种情况下它将适用于所有工厂,但这肯定会破坏那些没有定义finance_estimate和{{1}的工厂它可能甚至不能用于虚拟属性,因为它们只在单个工厂的上下文中定义。