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

Rspec private method can't access class instance variable?

我正在测试我的 class' 初始化方法。它调用一个私有方法,但由于某种原因该方法失败了。

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

当我在 nil? 检查之前放置一个 puts 时,令牌什么也不打印,但当我的 rake 任务调用 initialize 方法时,它打印正常。

因为您在私有范围内创建了您的方法 check_configs,所以您无法从初始化方法访问它,因为您正在初始化的对象正在寻找一个基本上隐藏在 class。您要么需要创建方法 public,要么修改初始化方法以不包含私有方法。

  • 注意,我回来后发现这还不够清楚。

Initialize 方法始终是 public,因此它们不能在方法中包含任何私有范围。除了初始化方法

之外,您可以在 class 中的任何其他地方调用私有方法

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

你的例子有点混乱,因为你试图概括你的问题时出现了各种拼写错误。我创建了以下两个文件,规格 运行 就好了。可能是您遇到的命名错误,而不是实际的 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 进行低值测试。