Async function in mocha before() is alway finished before it() spec?

asynchronous, javascript, mocha.js

Solution

For new mocha versions :

You can now return a promise to mocha, and mocha will wait for it to complete before proceeding. For example, the following test will pass :

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

You can find the documentation here

For older mocha versions :

If you want your asynchronous request to be completed before everything else happens, you need to use the `done` parameter in your before request, and call it in the callback.

Mocha will then wait until `done` is called to start processing the following blocks.

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

You should be careful though, as not stubbing the database for unit testing may strongly slow the execution, as requests in a database may be pretty long compared to simple code execution.

For more information, see the Mocha documentation.

Problem

I have a callback function in `before()` which is for cleaning database. Is everything in `before()` guaranteed to finish before `it()` starts? ``` 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(){ }); ```

Original source

Related problems