连接在Rspec中被solr拒绝

我用sunspot-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 ,然后运行规范,它就会通过。

怎么了? 不是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)可能只是没有让索尔有足够的时间开始。

也就是说,您可能想要仔细考虑您要求您的规格在此validation的内容。 你可以通过像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,那么您已经走上了正确的轨道。 只要在那里sleep就有足够的时间让Solr在你的规格开始运行之前完全启动。 如果在系统负载不足时会在规范套件中引入一些不可预测的故障,请不要感到惊讶。

[编辑: before :all快速和脏before :all使用Sunspot.remove_all进行轮询的可用性。]

 before :all do `sunspot-solr start` begin Sunspot.remove_all! rescue Errno::ECONNREFUSED sleep 1 && retry end end 

sunspot_test gem将为您执行此操作并支持RSpec。

这是一个疯狂的猜测,但我敢打赌你在config / environments / development.rb文件中配置了一个Solr服务器,以便在给定端口上本地查看,但在config / environments / test.rb中没有这样的配置。

这导致它连接到默认地址/端口,在执行测试时实际上并没有运行Solr服务器。

我对Ruby中的Solr客户端了解不多,以确保这一点,但由于没有其他人权衡,我希望这能指出你正确的方向。

我只是通过添加来实现这一点

 `rake sunspot:solr:start RAILS_ENV=test` 

到spec_helper.rb

编辑:我最终选择了像Simmo提到的https://github.com/collectiveidea/sunspot_test 。 由于某种原因,它在每次测试运行时重新运行rake任务(即使我在spfor的prefork块中有它)。 不知道为什么,但sunspot_testgem似乎是现在的方式。