2014-07-13 6 views
51

Ho una funzione di richiamata in before() che è per la pulizia del database. È tutto in before() terminato prima che inizi it()?La funzione asincrona in mocha before() è sempre finita prima di() spec?

before(function(){ 
    db.collection('user').remove({}, function(res){}); // is it guaranteed to finish before it()? 
}); 

it('test spec', function(done){ 
    // do the test 
}); 

after(function(){ 
}); 
+0

Questo dovrebbe funzionare. Devi solo assicurarti di restituire una promessa dal tuo gestore "prima". Per esempio. 'before (function() {return db.collection ...}' – broofa

risposta

84

Per le nuove versioni moka:

È ora possibile tornare una promessa di moka, moka e dovrà attendere che sia completato prima di procedere. Ad esempio, il seguente test passerà:

let a = 0; 
before(() => { 
    return new Promise((resolve) => { 
    setTimeout(() => { 
     a = 1; 
     resolve(); 
    }, 200); 
    }); 
}); 
it('a should be set to 1',() => { 
    assert(a === 1); 
}); 

È possibile trovare la documentazione here

Per le versioni moka più vecchie:

Se volete che il vostro richiesta asincrona per essere completato prima di tutto accada , è necessario utilizzare il parametro done nella richiesta precedente e chiamarlo nella richiamata.

Mocha attenderà quindi che venga richiamato done per avviare l'elaborazione dei seguenti blocchi.

before(function (done) { 
    db.collection('user').remove({}, function (res) { done(); }); // It is now guaranteed to finish before 'it' starts. 
}) 

it('test spec', function (done) { 
    // execute test 
}); 

after(function() {}); 

Si dovrebbe fare attenzione però, come non spegnendo il database per unit testing può fortemente rallentare l'esecuzione, come le richieste in un database possono essere piuttosto lunga rispetto al semplice l'esecuzione di codice.

Per ulteriori informazioni, vedere Mocha documentation.

+0

Si noti che se l'operazione asincrona richiede troppo tempo, si otterrà un messaggio di errore che non è molto utile: https://stackoverflow.com/a/ 48087201/1827734 – BrDaHa

+0

Mocha ora supporta le promesse nei ganci - https://mochajs.org/#working-with-promises.Non c'è bisogno di usare 'done'. Restituisce solo una promessa – broofa

+0

Grazie a @broofa, ho aggiornato la risposta. –

Problemi correlati