Rails: Integrazione test thinking_sphinx con cetriolo e Webrat - come faccio indice infissi transazionali?

StackOverflow https://stackoverflow.com/questions/888744

Domanda

Mi piacerebbe avere qualche test di integrazione cetriolo / Webrat delle mie funzioni di ricerca che utilizzano thinking_sphinx & sphinx ma il problema è che i dati vengono caricati e poi il rollback di una transazione durante un test tipico cetriolo quindi non c'è alcun modo per thinking_sphinx all'indice esso. In alternativa, c'è un modo per trasformare le transazioni fuori solo per un sottoinsieme di test?

avete risolto questo problema?

[modifica - per favore non suggerendo beffardo i risultati di ricerca. Voglio il test di integrazione per testare l'integrazione di tutte le funzioni, tra cui thinking_sphinx].

È stato utile?

Soluzione

Io vedo il problema di essere in questa affermazione:

  

i dati vengono caricati e poi arrotolato indietro in una transazione durante una prova tipica cetriolo quindi non c'è modo per thinking_sphinx indicizzarlo

Non può essere veloce per avere thinking_sphinx indicizzare i risultati, ma è certamente possibile all'interno della transazione. Dal momento che è un test di integrazione singola, e non fatto per ciascuno dei vostri (molti) test di unità, mi piacerebbe prendere il colpo di velocità.

Quindi, ora è necessario capire come attivare che ri-index durante una transazione.

# somewhere in /features/support:
before('@reindexing') do
  require 'Rake'

  class MyModel
    after_save :force_reindex!

    def force_reindex!
      # in case multiple runs of this block cause the hook
      # to get added multiple times, let's check to make sure
      # we haven't already reindexed for this save
      return if @__reindexed
      Rake["thinking_sphinx:rebuild"].execute
      @__reindexed = true
    end
  end
end

after('@reindexing') do
  class MyModel
    def force_reindex!
      # do nothing; the hook still gets called, but that's ok
    end
  end
end

In /features/integration.feature (o qualsiasi altra cosa), si avrebbe

@reindexing
Feature: The whole shebang, altogether

  Scenario: ...

Altri suggerimenti

Siamo stati in grado di ottenere i nostri test di cetriolo di lavorare con successo con il pensiero sfinge utilizzando un plugin più pulito database e modificare il nostro caratteristiche / supporto / env.rb come segue:

# Sets up the Rails environment for Cucumber
ENV["RAILS_ENV"] ||= "cucumber"

...

# http://github.com/bmabey/database_cleaner
require 'database_cleaner'
DatabaseCleaner.strategy = :truncation
Before do
  DatabaseCleaner.clean
end

ThinkingSphinx::Configuration.instance.build
ThinkingSphinx::Configuration.instance.controller.start
at_exit do
  ThinkingSphinx::Configuration.instance.controller.stop
end
ThinkingSphinx.deltas_enabled = true
ThinkingSphinx.updates_enabled = true
ThinkingSphinx.suppress_delta_output = true

# Re-generate the index before each Scenario
Before do
  ThinkingSphinx::Configuration.instance.controller.index
end

Come si può vedere, abbiamo anche creato un ambiente 'cetriolo' e un database separato (al fine di eseguire il cetriolo e le specifiche contemporaneamente senza conflitti) - quindi sarà necessario aggiungere un 'cetriolo:' voce al database.yml e sphinx.yml se si desidera farlo pure.

Il suggerimento collegato non funziona, perché il compito Rake invoca l'indicizzatore in un processo separato, e così è al di fuori della transazione di prova.

Non so che non c'è alcun modo per aggirare questo, diverso da quello di spegnere le transazioni di prova in modo che il processo di indice di sfinge può visualizzare i record nuovi e aggiornati. Per fare questo, nel vostro TestCase, basta aggiungere la riga

self.use_transactional_fixtures = false

Si tenga presente che è necessario per gestire chiarire tutti i dati alla fine del test.

non mi consiglia di testare un componente che non si possiede. Sarà un test piuttosto fragile in quanto sarebbe dipendente dalla specifica procedura di posto in quella versione specifica di sfinge che potrebbe cambiare in seguito e restituire risultati imprevedibili in futuro in tal modo.

se si vuole fare questo Vorrei però suggerire l'esecuzione di un indice separato per testare sia utilizzando il database di test tramite l'adattatore mysql o l'opzione xmlpipe2 (xml2pipe consente ovviamente di cambiare set di dati senza dover modificare le opzioni di indicizzazione nella vostra file di sfinge). Ciò richiederà probabilmente di impostare il backup dei dati di test a parte tutto in una volta, eliminare gli indici (utilizzando i comandi della shell rubino) e poi forzare la reindicizzazione (in attesa che il numero totale di documenti indicizzati per essere lo stesso con la quantità di record del database ) ed eseguire i test con i dati.

Vorrei davvero in guardia contro testare l'indice di come ho detto si potrebbe anche trovare a dover affrontare una costante rottura di prova o di esecuzione di test lento (a seconda della quantità di dati che si sta Indicizzazione)

Questo è probabilmente più problemi di quanto quello che vale, ma hai provato a girare sugli indici delta?

Ho provato la soluzione suggerita ma gli orari di sfinge con il seguente errore. Non credo sia possibile ri-index sfinge, mentre infissi transazionali sono abilitati.

ERRORE: indice 'document_core': sql_query_pre [0]: blocco di timeout di attesa superato; provare a riavviare transazione

Un altro esempio di utilizzo di tag per separare cetriolo pensare test sfinge utilizzando i tag di cetriolo qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top