Rspec私有方法无法访问类实例变量?

时间:2015-04-03 19:04:13

标签: ruby-on-rails ruby rspec

我正在测试我的类'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方法时,它打印正常。

2 个答案:

答案 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.foosome_token的行为会有所不同。测试foo的行为是否随some_token的变化而变化是您想要的高价值测试。而不是对您是否正确编写@configs = configs的低值测试。