Introduction to Mocha!
What is Mocha?
Mocha is a JavaScript test framework running on Node.js and the browser which makes asynchronous testing smooth.
Baby step!
describe('Array', function() { // suite
describe('#indexOf()', function() { // suite
it('should not return -1 when the value is present', function() { // test
assert.notEqual(-1, [1, 2, 3].indexOf(3));
});
it('should return -1 when the value is not present', function() { // test
assert.equal(-1, [1, 2, 3].indexOf(5));
assert.equal(-1, [1, 2, 3].indexOf(0));
});
});
});
Diving into async storm!
// it uses `done`, just call it after you think your async will be finished
describe('SetTimeOut', function() {
it('why everyone is scared of me', function(done) {
setTimeout(function() {
assert.equal(1, 1);
done();
}, 3000);
// here timeout might give error, since the default timeout is 2 sec
// though good news is you can alter it yourself using
// flag --timeout 13000 or
// programatically - this.timeout(13000)
});
});
Delay the root suite!
setTimeout(function() {
describe('master of all suites', function() {
// write your cases here ..
});
run();
// again use flag --delay to use `run` function.
}, 3000);
console.log('Timer begins for 3 seconds atleast');
Hooks
describe('mocha hooks', function() {
before('description here', function(){
// runs before all test in this block
});
after('description here', function(){
// runs after all test in this block
});
beforeEach('description here', function(){
// runs before each test in this block
});
afterEach('description here', function(){
// runs after each test in this block
});
// your test cases here ..
});
Juggling async Promises
// using chai-as-promised
// bad
doSomethingAsync().then(function(result) {
result.should.equal('foo')
done();
}, function(err) {
done(err);
});
// good
return doSomethingAsync().should.eventually.equal('foo');
describe('Promises', function() {
it('deal with promises', function() {
// (2+2).should.equal(4)
// or
return Promise.resolve(2 + 2).should.eventually.equal(4);
});
});
Dynamically generating test suites
// adds only two numbers
function add() {
return arguments[0] + arguments[1];
}
describe('add()', function() {
var tests = [{
args: [1, 21],
expected: 22
}, {
args: [11, 3],
expected: 14
}, {
args: [3, 24],
expected: 27
}];
tests.forEach(function(test) {
it('correctly adds ' + test.args.length + ' args', function() {
var res = add.apply(null, test.args);
assert.equal(res, test.expected);
});
});
});
Check out the docs