Ruby on rails Rspec中未初始化的常量

Ruby on rails Rspec中未初始化的常量,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我创建了一个常量,其中包含我正在使用的应用程序的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.roo

我创建了一个常量,其中包含我正在使用的应用程序的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\u CONFIG
加载到rspec?目前,它在my rails控制台中工作正常,加载正常,但当我运行我的规范时,出现以下错误:

uninitialized constant SearchEngine::BING_CONFIG

BING\u CONFIG=…
字符串是否驻留在类/模块
搜索引擎中?如果是,请尝试

require 'search_engine'
(或如何调用包含该类的文件)位于
rspec
文件的顶部。如果否,请修复名称空间的问题,例如:

SearchEngine::BING_CONFIG = …

根据我的理解,只要您在
config/initializers
中配置这样的初始化,就应该在rspec运行中加载它。但它仍然不起作用

由于您的错误输出显示了
SearchEngine
name,我猜您已经将初始值设定项包装在一个模块中了


如果是这种情况,则应在上述分配之前引入
搜索引擎
模块名称。但是,当您引入模块名时,为了让Rails的autoloader满意,您必须遵循Rails根据名称空间层次结构命名文件(以及类/模块名)的方式。这取决于搜索引擎的定义。您想如何定义模块名称?

您可以在初始值设定项中添加
put“adding constant”
。之后,您将能够检查文件是否正确加载。若有,那个么问题就出在名称空间中。常量变量?这是自相矛盾的。是的,我去掉了。。。我不知道为什么我在其中添加了变量。我的rpsec文件包含我的类,并且名称空间似乎已就位。我得到的错误是:
uninitialized constant SearchEngine::BING_CONFIG
您能给我们看一下整个
CONFIG/initializers/BING.rb
文件吗?这就是整个文件。然后根据我回答中的第二个建议尝试修改它:
BING_CONFIG=…
SearchEngine::BING_CONFIG=…
我在这里设置了一个类:
app/services/search_engine.rb
正如我提到的,我的rails控制台可以很好地加载常量变量。这在我的测试中似乎不起作用。我似乎不明白为什么。Rails不知道
服务
路径。尝试将其移动到
app/models
(无论它是否为模块)下面并运行。我将其添加到我的application.rb文件中:
config.autoload\u path+=%W(#{config.root}/app/services)
这不会确保rails对我的服务目录是新的吗?就我之前测试的情况而言(为了实现独立于
ActiveRecord
)的逻辑,它起到了作用。但由于某种我不记得的原因,我坚持将逻辑放在
app/models
中。请先尝试放在rails已经知道的地方。。