首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RSpec变量作用域

RSpec变量作用域
EN

Stack Overflow用户
提问于 2016-04-21 00:25:40
回答 2查看 590关注 0票数 0

我在rspec测试中访问全局可用的@db变量时遇到了困难。@db变量在应用程序中设置,该应用程序通过spec_helper包含。

代码如下:

代码语言:javascript
复制
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

当我运行这段代码时,我得到了以下输出:

代码语言:javascript
复制
#<Sequel::Mysql2::Database: "mysql2://root:@localhost/my_project">
nil
nil

指示已从rspec测试外部正确设置了@db变量,但一旦测试运行,就无法访问该变量。如何从我的测试中访问@db

EN

回答 2

Stack Overflow用户

发布于 2016-04-21 01:34:01

@符号开头的变量是实例变量。它们属于特定的对象(即实例),并且只能从该对象访问。它们总是相对于self进行查找。

在您的示例中,您有两个不同对象的两个不同实例变量。

在第4行,self是所谓的main顶级对象。在第7行和第11行,self是类RSpec::ExampleGroups::MyModel::Constraints的一个实例,它是一个具有完全不同的实例变量集的完全不同的类的完全不同的对象。

如果您确实需要访问该特定的实例变量,您可以这样做:

代码语言:javascript
复制
$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钩子中的正确对象上设置实例变量。

票数 1
EN

Stack Overflow用户

发布于 2016-04-21 01:21:58

我不确定你的spec_helper.rb中有什么,但你应该包括以下内容:

代码语言:javascript
复制
RSpec.configure do |config|
  config.before(:each) do
    @db = 'your db object'
  end
end

这与在测试示例上直接定义之前钩子相同,只是它将在每次测试之前全局运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36749811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档