The `beforeEach()` Hook in Mocha
By default, Mocha's BDD interface adds a global beforeEach()
function.
You can call beforeEach()
with a function, and Mocha will execute that function before every test in the suite.
beforeEach(function() {
console.log('Running beforeEach!');
});
// Prints "Running beforeEach!"
it('test1', function() {});
// Prints "Running beforeEach!"
it('test2', function() {});
With describe()
describe()
lets you scope beforeEach()
hooks.
If you define a beforeEach()
in a describe()
, Mocha will not run that beforeEach()
on any tests outside of that describe()
.
beforeEach(function() {
console.log('Running global beforeEach!');
});
describe('my test suite', function() {
beforeEach(function() {
console.log('Running my test suite beforeEach!');
});
// Prints both "Running beforeEach!" and "Running my test suite beforeEach!"
it('test1', function() {});
// Prints both "Running beforeEach!" and "Running my test suite beforeEach!"
it('test2', function() {});
});
// Only prints "Running global beforeEach!"
it('test3', function() {});
So a global beforeEach()
will run on every test, even tests within a describe()
.
But a beforeEach()
hook within a describe()
will not run on any test outside of that describe()
.
Skipped Tests
Mocha will not run beforeEach()
if there are no tests.
For example, if you run a single Mocha test using .only()
, Mocha will not execute the beforeEach()
hook in the following test file.
describe('my test suite', function() {
beforeEach(function() {
console.log('Running my test suite beforeEach!');
});
it('test1', function() {});
it('test2', function() {});
});
// Because of `.only()`, Node will **not** print
// "Running my test suite beforeEach!"
it.only('test3', function() {});
Working Around Linters
By default, linters like ESLint complain that beforeEach()
is not defined.
There are a couple of workarounds.
First, you can explicitly import beforeEach()
from Mocha:
const { beforeEach } = 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
}
};