Ruby on rails Rspec中未初始化的常量
我创建了一个常量,其中包含我正在使用的应用程序的API密钥。它在rails控制台中工作,但我在测试中很难让它工作。我必须使用Bing,因此我添加了如下API: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
# 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已经知道的地方。。