我正在测试我的类'initialize方法。它调用私有方法,并且由于某种原因该方法失败。
Class(为简洁而简化的代码):
class MyClass
@configs = {}
def initialize(configs)
@configs = configs
check_configs
create_client
end
private
def check_configs
if @configs['some_token'].nil?
Rails.logger.git_loader.error('log message')
raise AnError
end
end
end
测试:
describe '#initialize' do
let(:config) { my_token: '123-FakeToken' }
let(:loader) { described_class.new(config) }
context 'when initialized with a set of configs' do
it { expect(loader.instance_variable_get(:@configs)).to eq(configs)}
end
end
当我在puts
检查之前放置nil?
时,令牌不打印任何内容,但是当我的rake任务调用initialize
方法时,它打印正常。
答案 0 :(得分:1)
因为你在私有作用域中创建了check_configs方法,所以你无法从initialize方法访问它,因为你正在初始化的对象正在寻找一个本质上对类隐藏的方法。您需要将方法设为公共或重新设置初始化方法以不包含私有方法。
Initialize方法始终是公共的,因此它们不能在方法中包含任何私有作用域。除了initialize方法
之外,您可以在类中的任何其他位置调用私有方法http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Private
答案 1 :(得分:1)
由于您尝试概括问题时出现各种拼写错误,因此您的示例有点令人困惑。我创建了以下两个文件,规格运行得很好。可能是您遇到的命名错误,而不是实际的rspec问题。
# test_spec.rb
require 'rspec'
require_relative 'my_class'
describe MyClass do
describe '#initialize' do
let(:configs) { {some_token: '123-FakeToken'} }
let(:loader) { described_class.new(configs) }
context 'when initialized with a set of configs' do
it { expect(loader.instance_variable_get(:@configs)).to eq(configs)}
end
end
end
和
# my_class.rb
class MyClass
#@configs = {}
def initialize(configs)
@configs = configs
check_configs
end
private
def check_configs
if @configs[:some_token].nil?
puts "log message"
raise 'an error'
end
end
end
那就是说,更大的问题是你试图通过测试完成什么?
测试私有变量是一种气味。理想情况下,在配置变量的情况下,它们会在设置时在您的实例中产生效果。例如,根据是否设置MyClass.foo
,some_token
的行为会有所不同。测试foo
的行为是否随some_token
的变化而变化是您想要的高价值测试。而不是对您是否正确编写@configs = configs
的低值测试。