tutorial rails ruby-on-rails ruby-on-rails-3 rspec elasticsearch tire

ruby on rails - tutorial - Cómo probar ElasticSearch en una aplicación Rails(Rspec)



elasticsearch rails (3)

Me preguntaba cómo estaba probando la búsqueda en su aplicación cuando usaba ElasticSearch and Tire.

  • ¿Cómo configura una nueva instancia de prueba de ElasticSearch? ¿Hay alguna forma de burlarse?

  • ¿Alguna gema que conozcas podría ayudarte con eso?

Algunas cosas que encontré útiles:

Encontré un excelente artículo respondiendo a casi todas mis preguntas :)

http://bitsandbit.es/post/11295134047/unit-testing-with-tire-and-elastic-search#disqus_thread

Además, hay una respuesta de Karmi, autor de Tyre.

Esto también es útil: https://github.com/karmi/tire/wiki/Integration-Testing-Rails-Models-with-Tire

No puedo creer que no los haya encontrado antes de preguntar ...


Prefijo de sus nombres de índice para el entorno actual

Puede establecer un nombre de índice diferente para cada entorno (en su caso: el entorno de prueba).

Por ejemplo, puede crear un inicializador en

config/initializers/tire.rb

con la siguiente línea:

Tire::Model::Search.index_prefix "#{Rails.application.class.parent_name.downcase}_#{Rails.env.to_s.downcase}"

Un enfoque concebible para eliminar los índices

Suponiendo que tiene modelos llamados Cliente, Orden y Producto, coloque el siguiente código en algún lugar de su prueba-inicio / antes-bloque / cada-ejecución-bloque.

# iterate over the model types # there are also ways to fetch all model classes of the rails app automaticly, e.g.: # http://.com/questions/516579/is-there-a-way-to-get-a-collection-of-all-the-models-in-your-rails-app [Customer, Order, Product].each do |klass| # make sure that the current model is using tire if klass.respond_to? :tire # delete the index for the current model klass.tire.index.delete # the mapping definition must get executed again. for that, we reload the model class. load File.expand_path("../../app/models/#{klass.name.downcase}.rb", __FILE__) end end

Alternativa

Una alternativa podría ser configurar una instancia de ElasticSearch diferente para probar en otro puerto, digamos 1234. En su entorno / test.rb podría establecer

Tire::Configuration.url "http://localhost:1234"

Y en una ubicación adecuada (por ejemplo, el inicio de prueba), puede eliminar todos los índices en la instancia de prueba de ElasticSearch con:

Tire::Configuration.client.delete(Tire::Configuration.url)

Quizás aún deba asegurarse de que sus definiciones de mapeo de llantas para sus clases de modelo sigan recibiendo llamadas.


Me encontré con problemas similares y así es como lo resolví. Ten en cuenta que mi solución se basa en la solución @spaudanjo. Como estoy usando spork, lo agrego dentro del bloque Spork.each_run , pero puedes agregarlo a cualquier otro bloque anterior / anterior.

# Define random prefix to prevent indexes from clashing Tire::Model::Search.index_prefix "#{Rails.application.class.parent_name.downcase}_#{Rails.env.to_s.downcase}_#{rand(1000000)}" # In order to know what all of the models are, we need to load all of them Dir["#{Rails.root}/app/models/**/*.rb"].each do |model| load model end # Refresh Elastic Search indexes # NOTE: relies on all app/models/**/*.rb to be loaded models = ActiveRecord::Base.subclasses.collect { |type| type.name }.sort models.each do |klass| # make sure that the current model is using tire if klass.respond_to? :tire # delete the index for the current model klass.tire.index.delete # the mapping definition must get executed again. for that, we reload the model class. load File.expand_path("../../app/models/#{klass.name.downcase}.rb", __FILE__) end end

Básicamente define su propio prefijo único para cada caso de prueba para que no haya índices. Todas las demás soluciones sufrieron un problema en el que incluso después de eliminar el índice, Elastic Search no actualizaba los índices (incluso después de ejecutar Model.index.refresh ), razón por la cual el prefijo aleatorio está allí.

También carga cada modelo y verifica si responde al tire por lo que ya no es necesario que mantengamos una lista de todos los modelos que responden al neumático tanto en spec_helper.rb como en otras áreas.

Como este método no "borra" los índices después de usarlos, tendrá que eliminarlos manualmente de forma regular. Aunque no me imagino que esto sea un gran problema, puede eliminarlo con el siguiente comando:

curl -XDELETE ''http://localhost:9200/YOURRAILSNAMEHERE_test_*/''

Para encontrar lo que es YOURRAILSNAMEHERE , ejecute rails console y ejecute Rails.application.class.parent_name.downcase . El resultado será el nombre de su proyecto.


Me encontré con un error peculiar al eliminar mi índice elasticsearch por neumático en mi suite rspec. En mi configuración Rspec, similar al blog Bits and Bytes, tengo una llamada after_each que limpia la base de datos y borra el índice.

Descubrí que necesitaba llamar al método create_elasticsearch_index de Tire, que es responsable de leer el mapeo en la clase ActiveRecord para configurar los analizadores apropiados, etc. El problema que estaba viendo era que tenía algunos campos: no analizados en mi modelo que en realidad estaban siendo analizados ( esto rompió la forma en que quería que las facetas funcionaran).

Todo estaba bien en el desarrollo, pero el conjunto de pruebas estaba fallando porque las palabras individuales se estaban desglosando y no toda la cadena de varias palabras. Parece que la configuración de asignación no se creó correctamente en rspec una vez que se eliminó el índice. Agregar la llamada create_elasticsearch_index solucionó el problema:

config.after(:each) do DatabaseCleaner.clean Media.tire.index.delete Media.tire.create_elasticsearch_index end

Los medios son mi clase modelo.