соединение отклонено из solr в Rspec

Я использую солнечные пятна для поиска. Это 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"). То же самое.)


person Lai Yu-Hsuan    schedule 06.09.2011    source источник


Ответы (4)


Ваш before(:all), вероятно, просто не дает Solr достаточно времени, чтобы начать.

Тем не менее, вы, вероятно, захотите хорошенько подумать о том, что вы просите свои спецификации проверить здесь. Вы можете пройти долгий путь, имитируя вызовы Solr с помощью такой библиотеки, как Fakeweb.

У 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 не предоставляется в противном случае для foreman start)

Наконец, если вы хотите запустить Solr в рамках своих спецификаций, вы уже на правильном пути. Просто добавьте туда 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
person Nick Zadrozny    schedule 07.09.2011
comment
благодаря. Кстати, как я могу узнать, работает ли solr в моей спецификации? Я хочу более правильное пользовательское исключение вместо «соединение отклонено» - person Lai Yu-Hsuan; 07.09.2011
comment
Я думаю, что Errno::ECONNREFUSED довольно показательно. Фактически, вы можете использовать это для опроса доступности. Просто взломал это в редактировании. - person Nick Zadrozny; 08.09.2011

гем sunspot_test сделает это за вас и поддерживает RSpec.

person Simmo    schedule 02.11.2011

Это дикая догадка, но держу пари, у вас есть сервер Solr, настроенный в вашем файле config/environments/development.rb для локального поиска на заданном порту, но такой конфигурации нет в вашем >config/environments/test.rb

Это приводит к тому, что он подключается к адресу/порту по умолчанию, где на самом деле у вас нет запущенного сервера Solr, когда вы выполняете свои тесты.

Я недостаточно знаю о клиенте Solr на Ruby, чтобы быть уверенным в этом, но, поскольку никто еще не взвесился, я надеюсь, что это укажет вам правильное направление.

person Winfield    schedule 06.09.2011

Я получил это, просто добавив

`rake sunspot:solr:start RAILS_ENV=test`

в spec_helper.rb

Изменить: я остановился на https://github.com/collectiveidea/sunspot_test, как упоминал Симмо. По какой-то причине он перезапускал задачу rake при каждом тестовом прогоне (хотя у меня она была в блоке prefork spork). Не знаю почему, но гем sunspot_test кажется подходящим на данный момент.

person Brian Armstrong    schedule 12.11.2011