I've got a test suite that looks like the below:
(Notice the accountToPost
variable at the top (below the first describe
block)
describe('Register Account', function () {
var accountToPost;
beforeEach(function (done) {
accountToPost = {
name: 'John',
email: 'email@example.com',
password: 'password123'
};
done();
});
describe('POST /account/register', function(){
describe('when password_confirm is different to password', function(){
//accountToPost is undefined!
accountToPost.password_confirm = 'something';
it('returns error', function (done) {
//do stuff & assert
});
});
});
});
My issue is that when I try to modify accountToPost
in my nested describe block, it's undefined...
What can I do to fix this?
Keep the assignment where it is but wrap in in a
beforeEach
callback and your code will execute:Mocha loads your file and executes it, which means the
describe
calls are executed right away before Mocha actually runs the test suite. That's how it figures out the set of tests you've declared.I typically put nothing more than function and variable declarations in the body of the callbacks I pass to
describe
. Everything that changes the state of objects used in testing belongs inbefore
,beforeEach
,after
orafterEach
, or inside the tests themselves.Another thing to know is that
beforeEach
andafterEach
are executed before and after the callbacks to theit
calls not the callbacks to thedescribe
calls. So if you thought yourbeforeEach
callback would execute beforedescribe('POST /account/register', ...
this is not correct. It executes just beforeit('returns error', ...
.This code should illustrate what I am talking about:
If you run mocha on this code, you'll see the numbers being output to the console in increasing order. I've structured it the same way your test suite is structured, but with the addition of my recommended fix. The numbers 0 to 4 are output while Mocha is figuring out what tests are present in the suite. The testing has not begun yet. The other numbers are output during testing proper.