web-dev-qa-db-fra.com

La fonction asynchrone dans moka before () est toujours finie avant it () spec?

J'ai une fonction de rappel dans before() qui est pour le nettoyage de la base de données. Est-ce que tout dans before() est garanti avant que it() commence?

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(){
});
81
Nicolas S.Xu

Pour les nouvelles versions de moka:

Vous pouvez maintenant renvoyer une promesse à mocha, et mocha attendra qu'elle soit complète avant de continuer. Par exemple, le test suivant réussira:

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

Vous pouvez trouver la documentation ici

Pour les anciennes versions de moka:

Si vous souhaitez que votre demande asynchrone soit terminée avant que tout le reste ne se produise, vous devez utiliser le paramètre done dans votre demande avant et l'appeler dans le rappel.

Mocha attendra alors que done soit appelé pour commencer à traiter les blocs suivants.

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

Soyez prudent cependant, car ne pas écraser la base de données pour les tests unitaires peut fortement ralentir l'exécution, car les demandes dans une base de données peuvent être assez longues comparées à une simple exécution de code.

Pour plus d'informations, voir le documentation Mocha .

120
Clément Berthou

Espérons que votre db.collection () devrait retourner une promesse. Si oui, vous pouvez également utiliser le mot clé async dans 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
Mandeep Singh