[SOLVED] capybara-webkit, javascript, ajax, DatabaseCleaner e misterosi errori NotFound

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):

  1. Database cleaner pulisce il database con truncation
  2. inizio test, invocazione pagina
  3. pagina fa cose
  4. alcune di queste cose mandano eventi via ajax e vengono registrati
    nel database
  5. evento ajax invoca risorsa che salva un record nel db
  6. evento ajax invoca risorsa che salva un record nel db
  7. … etc…
  8. arrivo al punto che voglio testare. Ok, il test passa.
  9. fine del blocco di codice del test in rspec
  10. 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

  1. evento ajax invoca risorsa che salva un record nel db

:open_mouth:

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.

-f

Che condizione testi per verificare che sono esauriti gli eventi

Il giorno ven 13 feb 2015 19:09 Fabrizio R. [email protected] ha
scritto:

Quelli di Spree usano un helperino che fa sleep in base a $.active di
jQuery

L’avevo trovato interessante :slight_smile:

Fabrizio M.
Soc. Coop. weLaika

Il giorno 13 febbraio 2015 21:30, Antonio C.
[email protected]
ha scritto:

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.

2015-02-13 21:46 GMT+01:00 Fabrizio M. [email protected]: