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
进行低值测试。
我正在测试我的 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
进行低值测试。