La funzione asincrona in mocha before () è sempre finita prima che it () spec?


89

Ho una funzione di callback in before()cui è per la pulizia del database. È before()garantito che tutto finisca prima dell'inizio it()?

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(){
});

1
Questo dovrebbe funzionare. Devi solo assicurarti di restituire una promessa dal tuo beforegestore. Ad esempiobefore(function () { return db.collection...}
broofa

Risposte:


126

Per le nuove versioni moka:

Ora puoi restituire una promessa a mocha e mocha attenderà che venga completata 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);
});

Puoi trovare la documentazione qui

Per le versioni precedenti di moka:

Se vuoi che la tua richiesta asincrona venga completata prima che tutto il resto accada, devi usare il doneparametro nella tua richiesta precedente e chiamarlo nel callback.

Mocha aspetterà quindi fino a quando non doneviene chiamato 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() {});

Tuttavia, dovresti fare attenzione, poiché non eseguire lo stubbing del database per i test di unità potrebbe rallentare notevolmente l'esecuzione, poiché le richieste in un database potrebbero essere piuttosto lunghe rispetto alla semplice esecuzione del codice.

Per ulteriori informazioni, vedere la documentazione di Mocha .


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

Mocha ora supporta le promesse negli hook: mochajs.org/#working-with-promises . Non c'è bisogno di usare done. Restituisci solo una promessa.
broofa

Puoi anche: before(function () { return db.collection('user').remove({}); })poiché remove()restituisce una promessa, non è necessario racchiuderla in unnew Promise()
Brent Greeff

7

Si spera che db.collection () restituisca una promessa. Se sì, puoi anche usare la parola chiave asincrona in before ()

// Note: I am using Mocha 5.2.0.
before(async function(){
   await db.collection('user').remove({}, function(res){}); // it is now guaranteed to finish before it()
});

4
Che ne dici di after()? Il mio awaitfunziona bene quando lo chiamo before()(cancella una voce di DB), ma se inserisco la stessa identica cosa after(), non cancella nulla entro l' describe()...it()inizio di un secondo e fallisce perché i dati non vengono rimossi.
Juha Untinen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.