Ruby on rails 重写初始化错误测试环境

Ruby on rails 重写初始化错误测试环境,ruby-on-rails,ruby,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 at

我很难理解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
重写方法集是否会导致其他问题?

尝试

AdwordHelper.class_eval do
  def set_budget(budget)
    true
  end
end
class AdwordHelper
将在原始AdwordHelper尚未加载时定义该类,在这种情况下,类中唯一存在的方法是set\u budget。它不知道用一个参数初始化


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

是否可能因为测试文件中已经定义了
AdwordsHelper
,所以您的类没有被自动加载?请在您的
#FIXME
注释之后尝试
require\u relative'../../app/classes/adwords\u helper'
(或任何路径)。谢谢您的修复。我更喜欢这个解决方案,而不是类评估解决方案。这个方法也很有效。谢谢我更喜欢zach提到的解决方案,因为它感觉更自然。