Rails: Integrazione test thinking_sphinx con cetriolo e Webrat - come faccio indice infissi transazionali?
-
23-08-2019 - |
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].
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 .