Introduction

Mocha is one of the well-known frameworks for JavaScript unit testing. If you are very new to JavaScript unit testing, then please visit my previous article.
In the previous article, I covered the basic unit testing concept with Jasmine. Now, in this part, I am going to discuss one more framework, Mocha, and the assertion framework, chai.js.
Mocha is a testing JavaScript framework so it is hosted on node.js. It is easy to understand and also, the reporting feature of Mocha is good. So, without wasting time, we can start learning about it.
First, visit here for downloading and installing Mocha.
Two options are available here using npm.
  1. Local (only for the project)
    npm install --save-dev mocha
  2. Global
    npm install --global mocha

Create a simple application using Mocha

I have installed Mocha globally.
Now create a folder and open that in any IDE/Editor, like Sublime Text or Visual Studio Code (Here, I have used Sublime Text).
JavaScript Testing Using Mocha And Chai
Create a test folder and inside that, add one file named first.test.js.
JavaScript Testing Using Mocha And Chai
Open the terminal and use the command
mocha
Note

If you are using local Mocha installer, then instead of it, use ./node_modules/mocha/bin/mocha
JavaScript Testing Using Mocha And Chai
Also, you can change in package.json.
  1. "scripts": {
  2. "test": "mocha"
  3. }
Then, one can use the command to run the application - npm test
While writing a test case, we have got two keywords.
  1. Describe- Describe is a group of test cases that can be used to test a specific behavior or functionality of the JavaScript application. The describe function contains two parameters name and function. In this function, we can add one or many descriptions of its block.
  2. It- it is like an individual test case.
    It is also having the same two params as describe - name of "it" feature, and function. This function contains the actual code alone with assertions. We will see what is an assertion in detail.

Test execution hooks

Hooks mean some methods where we can write the common code which executes before and after the test case.
  1. describe('calculator application', function() {
  2. before(function() {
  3. // runs before all tests in this block
  4. });
  5. after(function() {
  6. // runs after all tests in this block
  7. });
  8. beforeEach(function() {
  9. // runs before each test in this block
  10. });
  11. afterEach(function() {
  12. // runs after each test in this block
  13. });
  14. // test cases
  15. it('addition',function() {
  16. //addition test case logic
  17. });
  18. it('subtraction',function() {
  19. //subtraction test case logic
  20. });
  21. it('multiplication',function() {
  22. //multiplication test case logic
  23. });
  24. it('division',function() {
  25. //division test case logic
  26. });
  27. });

Assertions

The assertion module is a part of node.js module. This can be used not only for Mocha but for all other frameworks to validate the test case. Assertion has two main parameters - actual and expected. There are so many frameworks available to extend the node.js assertion and add some very good features so that we can implement a better assertion in our test case. One of the popular frameworks is chai.js.
Integrate chai.js in Mocha application
First, download and install chai.js.
npm install chai --save
Please visit here for a detailed understanding of chai.js.
Using the below line of code, you can import Chai assertion packages in your JavaScript test case.
  1. var assert = require('chai').assert;
The below line of code gives you some basic information on asserts.
  1. Var foo = 'bar', beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };
  2. assert.typeOf(foo, 'string'); // without optional message
  3. assert.typeOf(foo, 'string', 'foo is a string'); // with optional message
  4. assert.equal(foo, 'bar', 'foo equal `bar`');
  5. assert.lengthOf(foo, 3, 'foo`s value has a length of 3');
  6. assert.lengthOf(beverages.tea, 3, 'beverages has 3 types of tea');
Assertion in chai.js in details
There are so many assertions available. Let us create and run the sample Mocha application with chai.js.
  1. var assert = require('chai').assert;
  2. describe('mocha testing with chai assert ', function() {
  3. it('test case for foo', function() {
  4. var foo = 'bar';
  5. assert.typeOf(foo, 'string'); // without optional message
  6. assert.typeOf(foo, 'string', 'foo is a string'); // with optional message
  7. assert.equal(foo, 'bar', 'foo equal `bar`');
  8. assert.lengthOf(foo, 3, 'foo`s value has a length of 3');
  9. });
  10. it('check beverages has 3 types of tea', function() {
  11. var beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };
  12. assert.lengthOf(beverages.tea, 3, 'beverages has 3 types of tea');
  13. });
  14. });
JavaScript Testing Using Mocha And Chai
Generation of test cases dynamically
  1. var assert = require('chai').assert;
  2. function add() {
  3. return Array.prototype.slice.call(arguments).reduce(function(prev, curr) {
  4. return prev + curr;
  5. }, 0);
  6. }
  7. describe('add()', function() {
  8. var tests = [
  9. {args: [1, 2], expected: 3},
  10. {args: [1, 2, 3], expected: 6},
  11. {args: [1, 2, 3, 4], expected: 10}
  12. ];
  13. tests.forEach(function(test) {
  14. it('correctly adds ' + test.args.length + ' args', function() {
  15. var res = add.apply(null, test.args);
  16. assert.equal(res, test.expected);
  17. });
  18. });
  19. });
JavaScript Testing Using Mocha And Chai

Summary

Mocha framework is used not only for unit testing but also, we can use it to implement a RESTful framework and an Automation framework using Selenium Webdriver.