我在rspec测试中访问全局可用的@db变量时遇到了困难。@db变量在应用程序中设置,该应用程序通过spec_helper包含。
代码如下:
require File.expand_path '../../spec_helper.rb', __FILE__
p @db
describe MyModel do
before do
p @db
end
context 'constraints' do
it 'is expected to do something' do
p @db
end
end
end当我运行这段代码时,我得到了以下输出:
#<Sequel::Mysql2::Database: "mysql2://root:@localhost/my_project">
nil
nil指示已从rspec测试外部正确设置了@db变量,但一旦测试运行,就无法访问该变量。如何从我的测试中访问@db?
发布于 2016-04-21 01:34:01
以@符号开头的变量是实例变量。它们属于特定的对象(即实例),并且只能从该对象访问。它们总是相对于self进行查找。
在您的示例中,您有两个不同对象的两个不同实例变量。
在第4行,self是所谓的main顶级对象。在第7行和第11行,self是类RSpec::ExampleGroups::MyModel::Constraints的一个实例,它是一个具有完全不同的实例变量集的完全不同的类的完全不同的对象。
如果您确实需要访问该特定的实例变量,您可以这样做:
$main = self
require File.expand_path '../../spec_helper.rb', __FILE__
p @db
describe MyModel do
before do
p $main.instance_variable_get(:@db)
end
context 'constraints' do
it 'is expected to do something' do
p $main.instance_variable_get(:@db)
end
end
end但最简单的解决方案是在before钩子中的正确对象上设置实例变量。
发布于 2016-04-21 01:21:58
我不确定你的spec_helper.rb中有什么,但你应该包括以下内容:
RSpec.configure do |config|
config.before(:each) do
@db = 'your db object'
end
end这与在测试示例上直接定义之前钩子相同,只是它将在每次测试之前全局运行。
https://stackoverflow.com/questions/36749811
复制相似问题