Ciao,
condivido con voi la soluzione di un problema che mi ha tenuto mezza
giornata, e che alla fine ho risolto.
Se vi capita di testare un progetto javascript con capybara-webkit
(cosa che consiglio per via della completezza con cui riuscite a
coprire tutto quanto), ricordate che la fine del test non sempre
coincide con la fine dell’esecuzione di eventuali chiamate ajax.
Nel mio caso si verificava la seguente situazione (schematizzo):
Database cleaner pulisce il database con truncation
inizio test, invocazione pagina
pagina fa cose
alcune di queste cose mandano eventi via ajax e vengono registrati
nel database
evento ajax invoca risorsa che salva un record nel db
evento ajax invoca risorsa che salva un record nel db
… etc…
arrivo al punto che voglio testare. Ok, il test passa.
fine del blocco di codice del test in rspec
DatabaseCleaner pulisce il database
A questo punto vi aspettereste un bel verde, il test passato. E
invece no. Ecco quello che ho scoperto che succedeva
evento ajax invoca risorsa che salva un record nel db
Morale della favola, altri eventi innescati prima della fine del test
venivano ricevuti da capybara dopo la fine del test dopo che
DatabaseCleaner aveva iniziato a pulire tutto.
Da cui scaturivano errori ActiveRecord::RecordNotFound misteriosi.
Ho risolto con un ciclo all’ultima riga del test che aspetta che si
esauriscano tutti gli eventi asincroni prima di mettere fine al test.
Non ho potuto usare direttamente $.active. Comunque una cosa simile
che fa lo sleep fino a quando tutti gli eventi che mi aspetto non sono
stati ricevuti.