ruby のオープンクラスのエラーを理解するのに苦労しています。テスト環境 (レール) でメソッドをオーバーライドすると、初期化時に無効な引数エラーが発生します。何らかの理由で、新しいメソッドをオーバーライドすると問題が解決しました。なんで?
私のクラス:
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
テストでは、実際のアドワーズ サーバーと通信したくないので、メソッドの 1 つをオーバーライドします。
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 をオーバーライドすると、他の癖が発生しますか?