10

Sto utilizzando Cucumber per scrivere i miei test di integrazione e Database Cleaner per mantenere pulito il mio db. Tutto funziona perfettamente in quanto i miei test non richiedono Javascript.Problema di pulizia del database con il webkit Capybara

Posso eseguire questi ultimi test utilizzando Capybara webkit, ma il mio db non viene pulito.

Ecco il mio caratteristiche/supporto/env.rb del file:

require 'simplecov' 
SimpleCov.start 'rails' 
require 'cucumber/rails' 

Capybara.default_selector = :css 
Capybara.javascript_driver = :webkit 

begin 
    require 'database_cleaner' 
    require 'database_cleaner/cucumber' 
    DatabaseCleaner[:active_record].strategy = :transaction 
rescue NameError 
    raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it." 
end 


Before do 
    DatabaseCleaner.start 
end 

After do |scenario| 
    DatabaseCleaner.clean 
end 

ho provato qualcosa di simile a this per verificare quale driver viene utilizzato da Capybara, ma non ha funzionato. Ho anche provato l'hack menzionato nella terza parte di this post ma poi niente ha funzionato affatto ...

Io davvero non so come raggiungere questo e qualsiasi aiuto sarebbe molto apprezzato.

Grazie in anticipo.

risposta

22

risposta rapida:

Configurare il JavaScript mette alla prova per usare il troncamento invece di transazioni:

DatabaseCleaner.strategy = :truncation 

più lunga spiegazione:

La strategia di transazione non funziona bene con i test di JavaScript , poiché molti driver capybara con supporto JavaScript eseguono i test in un thread diverso rispetto al codice dell'applicazione.

Ecco uno schema di base del processo:

  • Capybara stivali la vostra applicazione rack utilizzando webrick o sottile in un thread in background.
  • Il thread principale imposta il driver, fornendo la porta su cui è in esecuzione l'applicazione rack.
  • I test chiedono all'autista di interagire con l'applicazione, il che fa sì che il falso browser web esegua richieste contro l'applicazione.

Ciò è necessario perché è difficile creare un browser falso che esegue richieste su un'applicazione rack in memoria. In alcuni driver di database, non è sicuro eseguire query da più thread sulla stessa transazione.

Il risultato finale di questo è che è necessario eseguire il commit delle transazioni nel codice di test per rendere visibili i dati nel codice dell'applicazione. Il modo più semplice per risolvere questo problema è utilizzare la strategia di pulizia del database di troncamento.

È possibile configurare RSpec (o Cucumber) per utilizzare le transazioni per tutto tranne i test JavaScript. Questo sarà più veloce per i test non JavaScript mentre si sta ancora lavorando per i test JavaScript.

Avdi Grimm ha un buon post sul blog su questo argomento che descrive la soluzione in dettaglio: http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/

0

Le startegie basate su transazioni non funzionano con il cetriolo. La ragione di ciò è che hai due processi separati in esecuzione, uno sta eseguendo il tuo server delle app e poi un altro sta facendo richieste reali. Ci sono diversi modi per aggirare questo, ma sono degli hack sporchi. La soluzione pulita consiste nell'utilizzare il troncamento come strategia di DatabaseCleaner.

DatabaseCleaner.strategy = :truncation 

Before do 
    DatabaseCleaner.clean_with :truncation 
end 
+2

E 'corretto dire che le strategie di transazione non funzionano con cetrioli. Dipende dal driver di Capybara che stai usando. Con il test del rack, tutto è in-process, quindi la strategia di transazione dovrebbe funzionare. –

+0

Andy hai ragione. Dato che ho @javascript abilitato tutto il tempo, mi sono completamente dimenticato del vecchio test del rack. – svyatogor