The `before()` Hook in Mocha
By default, Mocha's BDD interface adds a global before()
function that registers a function Mocha will run before any tests.
before()
is similar to beforeEach()
; the key difference is that before()
will run at most once, beforeEach()
will run once before every test.
// Prints "Running before!"
before(function() {
console.log('Running before!');
});
it('test1', function() {});
it('test2', function() {});
before()
is typically used to set up any logic that is too slow to execute before every test, like establishing a database connection or starting an HTTP server.
You can use beforeEach()
instead of before()
in most cases.
With describe()
You can also call before()
in a describe()
.
That tells Mocha to run the before()
function before any tests in the describe()
.
// Prints "Running before!"
describe('suite', function() {
before(function() {
console.log('Running before!');
});
it('test1', function() {});
it('test2', function() {});
});
Mocha is smart enough to skip the before()
hook if there's no tests to run in your describe()
.
For example, if you run a single test using .only()
, the before()
hook in the following example will not run.
// Does **not** print "Running before!"
describe('suite', function() {
before(function() {
console.log('Running before!');
});
it('test1', function() {});
it('test2', function() {});
});
it.only('test3', function() {});
Working Around Linters
By default, linters like ESLint complain that before()
is not defined.
There are a couple of workarounds.
First, you can explicitly import before()
from Mocha:
const { before } = require('mocha');
Or, you can set the ESLint Mocha environment in a .eslintrc.js
in your test
folder as follows.
For example, Mongoose uses this approach to avoid having to explicitly import Mocha hooks.
// .eslintrc.js
module.exports = {
env: {
mocha: true
}
};