我使用黑子 rails 进行搜索。这些是Rspec的样子:
describe "GET search" do
before(:all) do
system("rake", "sunspot:solr:start")
end
after(:all) do
system("rake", "sunspot:solr:stop")
end
it "should do some search" do
Text.search do
...
end
end
end
但这是行不通的。我失败了:
Errno::ECONNREFUSED:
Connection refused - connect(2)
但是,如果我在命令行中手动键入
rake sunspot:solr:start RAILS_ENV=test
,然后运行该规范,它将通过。怎么了?在测试模式下,
rake sunspot:solr:start RAILS_ENV=test
是否不等于system("rake", "sunspot:solr:start")
?(我尝试了`system(“rake”,“sunspot:solr:start RAILS_EVN = test”。)相同。)
最佳答案
您的before(:all)
可能没有给Solr足够的时间来启动。
就是说,您可能会想认真考虑一下您要求规范在此处进行验证的内容。您可以使用Fakeweb之类的库来模拟对Solr的调用,这可以做很多工作。
Pivotal Labs还有一个名为sunspot_matchers的库,可以捕获有关您正在调用的搜索的更详细的断言。
如果您要针对Solr制定真正的集成规范,我建议您在工作时仅保持测试Solr运行。像Foreman这样的工具可以帮助您管理Solr流程。我可能会使用类似于以下的Procfile
:
solr_dev: rake sunspot:solr:run RAILS_ENV=development
solr_test: rake sunspot:solr:run RAILS_ENV=test
(如果没有为
foreman start
提供RAILS_ENV,则开发是默认环境)最后,如果您想在自己的规范范围内启动Solr,那么您已经走上了正确的 rails 。只需在其中投入足够的时间来释放
sleep
,以使Solr在您的规范开始运行之前就完全自行启动。如果在系统负载时,这会给您的规范套件带来一些不可预测的故障,请不要感到惊讶。[编辑:快速而肮脏的
before :all
,它使用Sunspot.remove_all
轮询可用性。]before :all do
`sunspot-solr start`
begin
Sunspot.remove_all!
rescue Errno::ECONNREFUSED
sleep 1 && retry
end
end
关于ruby-on-rails - Rspec中的solr拒绝了连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7325885/