连接在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似乎是现在的方式。