ruby-on-rails - Rspec中的solr拒绝了连接

标签 ruby-on-rails 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是否不等于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/

相关文章:

ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询?

ruby-on-rails - 为什么太阳黑子会更改搜索 DSL block 中的 `self`?

ruby-on-rails - Ruby 和 Rails : setting current_user if statement

ruby-on-rails - 如何在设计中禁用加密密码?

ruby-on-rails - 如何让 Controller 等待延迟的作业,而应用程序的其余部分继续运行?

solr - apache solr 删除复制字段

linux - 在Linux服务器上部署Solr

java - 在 solr 5.1.0 中找不到用于配置的正确 solrconfig.xml 文件

ruby-on-rails - Rails 在使用 PostgreSQL 时出错