【问题标题】:Constant Uninitialized in RspecRspec中未初始化的常量
【发布时间】:2013-09-05 06:12:57
【问题描述】:

我创建了一个常量,其中包含我正在开发的应用程序的 API 密钥。它在 Rails 控制台中工作,但我很难让它在我的测试中工作。我必须使用 Bing,所以我像这样添加了 API:

# config/bing.yml
development:
  secret: 1234

test:
  secret: 5678

production:
  secret: abcd

# config/initializers/bing.rb
BING_CONFIG = YAML.load_file("#{::Rails.root}/config/bing.yml")[::Rails.env]

如何确保BING_CONFIG 加载到 rspec 中?目前,它在我的 rails 控制台中工作和加载正常,但是当我运行我的规范时,我收到以下错误:

uninitialized constant SearchEngine::BING_CONFIG

【问题讨论】:

  • 您可以将puts 'adding constant' 添加到您的初始化程序中。之后,您将能够检查文件是否正确加载。如果是这样,那么问题出在命名空间中。
  • 常量变量?这是自相矛盾的。
  • 是的,我删除了那个...我不知道为什么我在那里添加了变量。

标签: ruby-on-rails ruby rspec


【解决方案1】:

BING_CONFIG = … 字符串是否位于您的类/模块SearchEngine 中?如果是,请尝试

require 'search_engine'

(或如何调用包含该类的文件)在您的 rspec 文件顶部。如果不是,请修复命名空间的问题,例如:

SearchEngine::BING_CONFIG = …

【讨论】:

  • 我的 rpsec 文件包含我的类,并且命名空间似乎已经到位。我得到的错误是:uninitialized constant SearchEngine::BING_CONFIG
  • 你能给我们看看整个config/initializers/bing.rb文件吗?
  • 这是整个文件。
  • 不如尝试根据我回答中的第二个建议进行修改:BING_CONFIG = …SearchEngine::BING_CONFIG = …
【解决方案2】:

据我了解,只要您在config/initializers 中配置这样的初始化,即使在 rspec 运行中也应该加载它。但是还是不行……

由于您的错误输出显示 SearchEngine 名称,我猜您已将初始化程序包装在模块中。

如果是这样的话,SearchEngine 模块名称应该在上述赋值之前引入。但是当你引入模块名时,为了让 Rails 的自动加载器满意,你必须遵循 Rails 根据命名空间层次命名文件(和类/模块名)的方式。这取决于SearchEngine 的定义方式。你想如何定义模块名称?

【讨论】:

  • 我在这里设置了一个类:app/services/search_engine.rb 正如我所提到的,我的 Rails 控制台可以很好地加载常量变量。它似乎在我的测试中不起作用。我似乎不明白为什么。
  • Rails 不知道services 路径。尝试将其移至app/models 下方(无论是否为模块)并运行。
  • 我将它添加到了我的 application.rb 文件中:config.autoload_paths += %W(#{config.root}/app/services) 不会确保 rails 对我的服务目录有新的了解吗?
  • 就我之前的测试而言(实现独立于ActiveRecord 的逻辑),它确实有效。但由于某种我不记得的原因,我坚持将逻辑放入app/models。请先尝试放置 rails 已经知道的地方..
猜你喜欢
  • 2020-07-13
  • 2019-11-11
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多