我很难理解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会导致其他怪癖吗?
答案 0 :(得分:0)
尝试
AdwordHelper.class_eval do
def set_budget(budget)
true
end
end
class AdwordHelper
将在未加载原始AdwordHelper时定义类,在这种情况下,您的类中唯一存在的方法是set_budget。它不会用一个参数知道初始化。
然而,如果你使用class_eval,它会尝试加载包含AdwordHelper类的文件,然后将方法set_budget添加到类中。