соединение отклонено от solr в Rspec - PullRequest
9 голосов
/ 07 сентября 2011

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

Ответы [ 4 ]

14 голосов
/ 07 сентября 2011

Ваш 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
11 голосов
/ 02 ноября 2011

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

0 голосов
/ 13 ноября 2011

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

`rake sunspot:solr:start RAILS_ENV=test`

к spec_helper.rb

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

0 голосов
/ 07 сентября 2011

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

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

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

...