2011-09-06 11 views
9

Utilizo los rieles de manchas solares para la búsqueda. Estos son los siguientes:conexión rechazada de solr en 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 

Pero no funciona. Tengo un fracaso:

Errno::ECONNREFUSED: 
    Connection refused - connect(2) 

Pero si escribo rake sunspot:solr:start RAILS_ENV=test a mano en la línea de comandos y ejecute la especificación, a su paso.

¿Qué pasa? ¿No es rake sunspot:solr:start RAILS_ENV=test equivalente a system("rake", "sunspot:solr:start") en modo de prueba?

(probé `sistema ("rake", "manchas solares: Solr: iniciar RAILS_EVN = test") Igual..)

Respuesta

14

Su before(:all) probablemente no le está dando a Solr suficiente tiempo para comenzar.

Dicho esto, probablemente querrá pensar mucho acerca de 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 en busca de especificaciones de integración real contra Solr, le aconsejo que solo mantenga una prueba Solr ejecutándose mientras trabaja. Una herramienta como Foreman puede ayudarlo a administrar sus procesos de Solr. Yo podría utilizar un Procfile como la siguiente:

solr_dev: rake sunspot:solr:run RAILS_ENV=development 
solr_test: rake sunspot:solr:run RAILS_ENV=test 

(Desarrollo es, por supuesto, el entorno por defecto si no hay RAILS_ENV se disponga otra cosa a foreman start)

Por último, si desea iniciar Solr dentro de sus especificaciones , ya estás en el camino correcto. Simplemente arroje un sleep con suficiente tiempo para permitir que Solr se inicie completamente antes de que sus especificaciones comiencen a ejecutarse. 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 utiliza 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 
+0

gracias. Por cierto, ¿cómo puedo saber si Solr se está ejecutando en mi especificación? Quiero una excepción personalizada más adecuada en lugar de 'conexión rechazada' –

+0

Debería pensar que 'Errno :: ECONNREFUSED' es bastante indicativo. De hecho, podrías usar eso para sondear la disponibilidad. Solo lo pirateé en una edición. –

+0

gran solución. funcionó como un sueño para mí. – nfriend21

0

Esta es una suposición-culo, pero apuesto a que ha configurado un servidor Solr en su config/ambientes/development.rb archivo para buscar de forma local en un puerto determinado, pero no hay tal configuración en el config/ambientes/test.rb

Esto está causando que se conecte a la dirección por defecto/puerto donde en realidad 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.

11

El sunspot_test gem va a hacer esto para usted y apoya RSpec.

+0

¡Impresionante, esta es la respuesta correcta! – Matthew

+0

Definitivamente una respuesta elegante y gema - gracias. –

0

Tengo este trabajo sólo mediante la adición

`rake sunspot:solr:start RAILS_ENV=test` 

a spec_helper.rb

Editar: Terminé yendo con https://github.com/collectiveidea/sunspot_test como Simmo mencionado. 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.

+0

¿Funciona para usted en Rails 3.1? –

Cuestiones relacionadas