2015-04-03 219 views
0

我在测试我的类的初始化方法。它调用一个私有方法,并由于某种原因该方法失败。Rspec私有方法无法访问类实例变量?

类(简化为简洁的代码):

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 

当我把一个putsnil?检查之前,令牌打印出什么,但在我的耙子任务打电话initialize方法,它打印罚款。

回答

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的低价值测试。

1

因为您在私有空间中创建了check_configs方法,所以您无法从初始化方法访问它,因为您正在初始化的对象正在寻找一个基本上对该类隐藏的方法。您可能需要公开方法或将您的初始化方法重新设置为不包含私有方法。

  • 请注意,我回来后发现并不清楚。

初始化方法总是公开的,因此它们不能在方法中包含任何私有范围。你可以在类中其他地方调用一个私有方法,除了初始化方法

http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Private