覆盖初始化错误测试环境

时间:2013-09-23 00:57:23

标签: ruby-on-rails ruby

我很难理解ruby的开放课程中的错误。覆盖测试环境(rails)中的方法会导致初始化时出现无效的参数错误。出于某种原因,覆盖新方法解决了这个问题。为什么呢?

我的课程:

require 'adwords_api'
require 'adwords_config'
require 'scanf'

class AdwordsHelper
  attr_accessor :adwords_id
  attr_accessor :campaign_id
  attr_accessor :adgroup_id
  attr_accessor :invalid_ops

  @@RETRY_INTERVAL = 3
  @@RETRIES_COUNT = 500
  @@config = 'adwords_api.yml'

  def initialize(args = {})
    self.adwords_id = AdwordsConfig.config[:master_account]

    return unless args.is_a?(Hash)
    args.each do |k,v|
      instance_variable_set("@#{k}", v) unless v.nil?
    end
  end

  def set_budget(budget)
    @api = get_adwords_api
    budget_id = get_budget_id

    service = @api.service(:BudgetService)
    operation = {
      :operator => 'SET',
      :operand => {
        :budget_id => budget_id,
        :amount => {
          :micro_amount => budget
        }
      }
    }

    service.mutate([operation])
  end
end

现在在测试中,我想覆盖其中一种方法,因为我不希望与实际的adwords服务器进行通信。

require "test_helper"
# FIXME override this in another file eventually
class AdwordsHelper
  def set_budget(budget)
    true
  end
end

调用

AdwordsHelper.new(campaign_id: 1)

为0错误提供无效参数1。

现在,覆盖新功能,解决了错误。

class AdwordsHelper
  def self.new(*args, &block)
    obj = allocate
    obj
  end
  def set_budget(budget)
    true
  end
end

重写方法set_budget会导致其他怪癖吗?

1 个答案:

答案 0 :(得分:0)

尝试

AdwordHelper.class_eval do
  def set_budget(budget)
    true
  end
end

class AdwordHelper将在未加载原始AdwordHelper时定义类,在这种情况下,您的类中唯一存在的方法是set_budget。它不会用一个参数知道初始化。

然而,如果你使用class_eval,它会尝试加载包含AdwordHelper类的文件,然后将方法set_budget添加到类中。