How to set timeout on before hook in mocha?
You can also call timeout()
on the return value from describe
, like this:
describe('test', () => {
before(...);
it(...);
}).timeout(10000);
With this approach you can use arrow functions, because you're no longer relying on this
.
Calling this.timeout(milliseconds);
in the before hook is correct. Anyway, you need to use a regular function for the hook (function (done) ...
) rather than an arrow function (done => ...
).
before(
function(done) {
this.timeout(10000);
...
}
);
And the reason is that arrow functions have no this
binding.
as instructed at https://mochajs.org/#hook-level, you have to use a regular function call to set the timeout.
before(function(done) {
this.timeout(3000); // A very long environment setup.
setTimeout(done, 2500);
});
if you insist on use arrow
or async
function in the hook. You may do it this way:
before(function (done) {
this.timeout(3000);
(async () => {
await initilizeWithPromise();
})().then(done);
});
It is quite helpful and nice-looking if you got multiple async calls to be resolved in the hook.
updated: fuction def works well with async
too. So this hook can be upgraded to
before(async function () {
this.timeout(3000);
await initilizeWithPromise();
});
So it provides benefits from both this
and await
.
By the way, mocha works pretty fine with promises
nowadays. If timeout is not a concern. Just do this:
before(async () => {
await initilizeWithPromise();
});
You need to set a timeout in your describe
block rather than in the hook if you want it to affect all the tests in the describe
. However, you need to use a "regular" function as the callback to describe
rather than an arrow function:
describe('test', function () {
this.timeout(10000);
before(...);
it(...);
});
In all places where you want to use this
in a callback you pass to Mocha you cannot use an arrow function. You must use a "regular" function which has its own this
value that can be set by Mocha. If you use an arrow function, the value of this
won't be what Mocha wants it to be and your code will fail.
You could set a different timeout for your before hook but there are two things to consider:
- Here too you'd need to use a "regular" function rather than an arrow function so:
before(function (done) {
this.timeout(10000);
- This would set a timeout only for the
before
hook and would not affect your tests.