我使用太阳黑子轨进行搜索.这些是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:启动RAILS_ENV =手动在命令行中测试,然后运行spec,它通过.
怎么了?不是耙子太阳黑子:solr:在测试模式下启动RAILS_ENV =测试相当于系统(“rake”,“sunspot:solr:start”)?
(我试过`system(“rake”,“sunspot:solr:start RAILS_EVN = test”)同样的)
解决方法
你之前(所有)可能只是没有给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
(开发当然是默认环境,如果没有RAILS_ENV另外提供给工头开始)
最后,如果要在您的规格中启动Solr,您已经在正确的轨道上.只要在那里放松一下睡眠,让Solr在您的规格开始运行前完全启动.如果系统处于负载状态时,如果在您的规格套件中引入了一些不可预知的故障,那就别惊讶.
[编辑:快速和肮脏之前:所有使用Sunspot.remove_all轮询可用性.]
before :all do `sunspot-solr start` begin Sunspot.remove_all! rescue Errno::ECONNREFUSED sleep 1 && retry end end