Getting Started
- Install mocha and chai in your project folder
npm install mocha --save
npm install chai --save
- Create a folder named test
- Add a file named start.js
- Add "mocha" to "test" in package.json
"test": "mocha"
- Add the following example to start.js
const expect = require('chai').expect;
it('should add numbers correctly', function () {
const num1 = 2;
const num2 = 3;
expect(num1 + num2).to.equal(5);
})
it('should nod give a result of 6', function () {
const num1 = 3;
const num2 = 3;
expect(num1 + num2).not.to.equal(5);
})
- Run the test
npm test
Real Scenario ExampleSay, we have a middleware named is-auth.js
module.exports = (req, res, next) => {
const authHeader = req.get('Authorization');
if(!authHeader) {
throw new Error('Not authenticated.');
}
}
Add the following to a new file in test folder — auth-test.jsconst expect = require('chai').expect;
const authMiddleware = require('../middleware/is-auth');
it('should throw error if authorization header is NOT present', function () {
const req = {
get: function (headerName) {
return null;
}
};
expect(authMiddleware.bind(this, req, {}, () => { })).to.throw('Not authenticated.');
})
it('should throw error if authorization header is only one word', function () {
const req = {
get: function (headerName) {
return 'xyz';
}
};
expect(authMiddleware.bind(this, req, {}, () => { })).to.throw();
})
Run the testnpm test
Outputproject@1.0.0 test C:\project
> mocha
√ should throw error if authorization header is NOT present
√ should throw error if authorization header is only one word
√ should add numbers correctly
√ should nod give a result of 6
4 passing (31ms)
Describe
Adding it blocks in describe function gives additional information of where the ojutput is coming fromAdd the following to auth-test.js
const expect = require('chai').expect;
const authMiddleware = require('../middleware/is-auth');
describe('Auth middleware', function () {
it('should throw error if authorization header is NOT present', function () {
const req = {
get: function (headerName) {
return null;
}
};
expect(authMiddleware.bind(this, req, {}, () => { })).to.throw('Not authenticated.');
})
it('should throw error if authorization header is only one word', function () {
const req = {
get: function (headerName) {
return 'xyz';
}
};
expect(authMiddleware.bind(this, req, {}, () => { })).to.throw();
})
})
Outputproject@1.0.0 test C:\project
> mocha
√ should add numbers correctly
√ should nod give a result of 6
Auth middleware
√ should throw error if authorization header is NOT present
√ should throw error if authorization header is only one word
4 passing (52ms)
What should not be tested and what should be
Functions from third party should not be tested by you. We must only test if our code behaves correctly on including the function.
Sinon
For restoring state of functions back if made changes for testing
Example,
sinon.stub(jwt, 'verify); // verify is the function of jwt library
jwt.verify.returns({userId: 'abc'}); // makes verify return {userId: 'abc'}
authMiddleware(req, {}, () => {}); // calls authMiddleware
expect(req).to.have.property('userId'); // checks if userId exists
expect(req).to.have.property('userId', 'abc'); // checks if value of userId is 'abc'
expect(jwt.verify.called).to.be.true; // checks if jwt.verfify function was called
jwt.verify.restore(); // restores state of jwt.verify back to what it was before testing
Comments
Post a Comment