Hossam Barakat Thoughts about ASP.NET, mobility, and technology.

Running Mocha with TypeScript

I was working on proof-of-concept to TypeScript with Mocha and I wanted to share my learning.

I was working on proof-of-concept to use TypeScript with Mocha. My objective was building a project where both the source and the tests written in TypeScript, executing tests using npm scripts and gulp and finally with a good debugging experience in both Visual Studio code and Web Storm.

TL;DR, Find the working sample here

Project Skeleton

The first step is to create an empty project directory and run npm init inside of it, then create two folders src and test:

- src
- test
package.json

Installing TypeScript

The project will written in TypeScript so let’s start by installing the typescript package:

npm install typescript --save-dev

The TypeScript uses a file called tsconfig.json in the root directory of the solution to define the compiler options so add new file to the root directory with the following content.

{
    "compilerOptions":{
        "module": "commonjs",
        "sourceMap": true,
        "target": "es2015",
        "isolatedModules": true
    }
}

You can read more about the tsconfig here

The Calculator

The project will be a simple calculator that can add two numbers. Add new file called Calculator.ts inside the src folder. The source code that we are going to test will be simple Calculator class with one method add:

export default class Calculator
{
    public Add(a :number,b:number): number {
        return a + b;
    }
}

The Test

The tests will be written in Mocha and the assertions will be done using Chai so let’s start by installing them

npm install mocha --save-dev
npm install chai --save-dev

Now proceed with creating a new file called calculator.spec.ts inside the test directory:

import { expect } from 'chai';
import Calculator from '../src/calculator';

describe("Calculator", () => {
    describe("Add", () => {
        it("Should return 3 when a = 1 and b = 2", () => {
            let calc = new Calculator();

            var result = calc.Add(1,2);

            expect(result).to.equal(3);
        });
    })
});

Running the tests

I’d like to be able to run the test through npm scripts as well as using gulps but first we need to install another package in order to be able to use Mocha with TypeScript:

npm install ts-node --save-dev

TypeScript Node is TypeScript execution environment and REPL for node

NPM Scripts

Update the package.json scripts section:

"scripts": {
    "test": "./node_modules/.bin/mocha --compilers ts:ts-node/register ./test/*.spec.ts"
  }

As you noticed in the above script we used the --compilers parameter to use the ts-node module to compile the TypeScript files.

Now you should be able to run the tests from command line:

npm test

The following result should be shown on your command window

  Calculator
    Add
      ✓ Should return 3 when a = 1 and b = 2


  1 passing (6ms)

Gulp

We need to install two more packages to be able to use Gulp:

npm install gulp --save-dev
npm install gulp-mocha --save-dev

Then adding gulpfile.js to the root directory:

const gulp = require('gulp');
const mocha = require('gulp-mocha');

gulp.task('run-tests', function(){
  return gulp.src('test/*.spec.ts')
        .pipe(mocha({
            reporter: 'nyan',
            require: ['ts-node/register']
        }));
});

gulp.task('default', [ 'run-tests' ]);

You can run the tests using gulp by running gulp command and you should see the output similar to the following:

[22:16:05] Using gulpfile ~/My files/Temp/mocha-with-typescript/gulpfile.js
[22:16:05] Starting 'run-tests'...
 1   -__,------,
 0   -__|  /\_/\ 
 0   -_~|_( ^ .^) 
     -_ ""  "" 

  1 passing (8ms)

[22:16:06] Finished 'run-tests' after 605 ms
[22:16:06] Starting 'default'...
[22:16:06] Finished 'default' after 8.96 μs

Debugging

Visual Studio Code

You can debug TypeScript tests inisde visual studio using node debug configurations with V8 inspector protocol, You can set the V8 inspect protocol by setting protocol to inspect:

{
    "name": "Run mocha",
    "type": "node",
    "request": "launch",
    "program": "${workspaceRoot}/node_modules/mocha/bin/_mocha",
    "stopOnEntry": false,
    "args": ["--no-timeouts", "--compilers", "ts:ts-node/register", "${workspaceRoot}/test/**/*.spec.ts"],
    "cwd": "${workspaceRoot}",
    "protocol": "inspector"
}

Web Storm

You can debug the TypeScript tests inside Web Storm by using the normal Mocha configuration but remember to include --require ts-node/register in the Extra Mocha options field:

comments powered by Disqus