Ruby on rails 重写初始化错误测试环境
我很难理解ruby开放类的错误。重写测试环境(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
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提到的解决方案,因为它感觉更自然。