ruby on rails - conexión rechazada de solr en Rspec
ruby-on-rails sunspot (4)
Esta es una adivinanza, pero apuesto a que tiene un servidor Solr configurado en su archivo config / environments / development.rb para buscar localmente en un puerto determinado, pero no existe tal configuración en su config / environments / test.rb
Esto está causando que se conecte a la dirección / puerto predeterminado, donde de hecho no tiene un servidor Solr ejecutándose cuando ejecuta sus pruebas.
No sé lo suficiente sobre el cliente de Solr en Ruby para estar seguro de esto, pero dado que nadie más ha intervenido aún, espero que esto lo guíe en la dirección correcta.
Yo uso los rieles de manchas solares para buscar. Este es un Rspec se ve así:
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
Pero no funciona. Tengo un fracaso:
Errno::ECONNREFUSED:
Connection refused - connect(2)
Pero si rake sunspot:solr:start RAILS_ENV=test
a mano en la línea de comandos, y luego ejecuta la especificación, pasa.
¿Qué pasa? No es rake sunspot:solr:start RAILS_ENV=test
equivalente al system("rake", "sunspot:solr:start")
en modo de prueba?
(Intenté `system (" rake "," sunspot: solr: start RAILS_EVN = test "). Mismo).
La gema sunspot_test lo hará por usted y es compatible con RSpec.
Lo hice funcionar simplemente agregando
`rake sunspot:solr:start RAILS_ENV=test`
a spec_helper.rb
Editar: terminé yendo con https://github.com/collectiveidea/sunspot_test como mencionó Simmo. Se estaba volviendo a ejecutar la tarea de rake en cada ejecución de prueba por algún motivo (aunque lo tenía en el bloque prefork de spork). No estoy seguro por qué, pero la gema sunspot_test parece ser el camino a seguir por el momento.
Su before(:all)
probablemente no le está dando a Solr suficiente tiempo para comenzar.
Dicho esto, es probable que desee reflexionar sobre lo que está pidiendo que verifiquen sus especificaciones aquí. Puede recorrer un largo camino burlándose de las llamadas a Solr con una biblioteca como Fakeweb.
Pivotal Labs también tiene una biblioteca llamada sunspot_matchers que puede capturar aserciones más detalladas sobre las búsquedas que está invocando.
Si va a buscar especificaciones de integración real contra Solr, le aconsejo que solo mantenga funcionando una prueba de Solr mientras trabaja. Una herramienta como Foreman puede ayudarlo a administrar sus procesos de Solr. Podría usar un Procfile
como el siguiente:
solr_dev: rake sunspot:solr:run RAILS_ENV=development
solr_test: rake sunspot:solr:run RAILS_ENV=test
(El desarrollo es, por supuesto, el entorno predeterminado si no se proporciona RAILS_ENV para el foreman start
)
Finalmente, si desea iniciar Solr dentro de sus especificaciones, ya está en el camino correcto. Solo sleep
allí con tiempo suficiente para permitir que Solr se inicie completamente antes de que sus especificaciones comiencen a funcionar. No se sorprenda si eso introduce un poco de falla impredecible en su conjunto de especificaciones cuando el sistema está bajo carga.
[Editar: Rápido y sucio before :all
que usa Sunspot.remove_all
para sondear la disponibilidad.]
before :all do
`sunspot-solr start`
begin
Sunspot.remove_all!
rescue Errno::ECONNREFUSED
sleep 1 && retry
end
end