2010-11-11 14 views
8

Tengo un método de clase en un modelo que llama al método de búsqueda() de thinking_sphinx. Necesito verificar este método de clase.Cómo probar ThinkingSphinx utilizando RSpec

Quiero comenzar, indexar o detener esfinge en mis casos de prueba rspec. Estoy intentando con este pedazo de código.

before(:all) do 
    ThinkingSphinx::Test.start 
end 

after(:all) do 
    ThinkingSphinx::Test.stop 
end 

y con este código en cada caso de prueba antes de disparar la consulta de búsqueda

ThinkingSphinx::Test.index 

pero aún después de despido a la consulta de búsqueda, me da resultados vacíos aunque coincidencias exactas hay en la prueba db.

favor, me guía con ejemplos de código si está utilizando rspec con thinking_sphinx

+0

Tenemos TS en un proyecto que necesita indexar 600k artículos. Es un gran cubo de FALLO. Las pruebas (como descubriste) son un verdadero dolor en el * ss. Nos estamos moviendo a SunSpot, que utiliza Solr. – Ariejan

Respuesta

4

Esto se debe a accesorios transaccionales.

Si bien ActiveRecord puede ejecutar todas sus operaciones dentro de una sola transacción, Sphinx no tiene acceso a eso, por lo que la indexación no incluirá los cambios de su transacción.

Tienes que deshabilitar tus dispositivos transaccionales.

En su rspec_helper.rb poner

RSpec.configure do |config| 
    config.use_transactional_fixtures = false 
end 

desactivar a nivel mundial.

Ver Turn off transactional fixtures for one spec with RSpec 2

12

Siguiendo David post, nos encontramos con solución siguiente:

#spec/support/sphinx_environment.rb 
require 'thinking_sphinx/test' 

def sphinx_environment(*tables, &block) 
    obj = self 
    begin 
    before(:all) do 
     obj.use_transactional_fixtures = false 
     DatabaseCleaner.strategy = :truncation, {:only => tables} 
     ThinkingSphinx::Test.create_indexes_folder 
     ThinkingSphinx::Test.start 
    end 

    before(:each) do 
     DatabaseCleaner.start 
    end 

    after(:each) do 
     DatabaseCleaner.clean 
    end 

    yield 
    ensure 
    after(:all) do 
     ThinkingSphinx::Test.stop 
     DatabaseCleaner.strategy = :transaction 
     obj.use_transactional_fixtures = true 
    end 
    end 
end 

#Test 
require 'spec_helper' 
require 'support/sphinx_environment' 

describe "Super Mega Test" do 
    sphinx_environment :users do 
    it "Should dance" do 
     ThinkingSphinx::Test.index 
     User.last.should be_happy 
    end 
    end 
end 

Es cambiar las tablas especificadas para: estrategia de truncamiento, y después de que el interruptor de nuevo a: la estrategia trasaction.

+0

Si tiene algún comentario no dude en publicarlo. – Max

+0

Ojalá pudiera votar esto más de una vez. – samullen

+0

@Max Tu código parece prometedor. ¿Dónde debe colocarse el código "ThinkingSphinx :: Test.init"? ¿También dónde debe colocarse el código de creación de datos de Factory_Girl? Tuve problemas para hacer que trabajaran. La página web vacía resultante se genera. Sospeché que TS no estaba viendo los datos o TS no iniciado/indexado correctamente. – GeorgeW

Cuestiones relacionadas