How to run Mocha tests written in TypeScript?
Using the latest version of Mocha and ts-node I was getting an Unexpected token import issue. Using the below settings with ts-mocha worked for me:
tsconfig.json
{
"files": [
"src/main.ts"
],
"compilerOptions": {
"noImplicitAny": true,
"target": "es2015",
"types": ["mocha"],
"module": "commonjs"
}
}
package.json
"scripts": {
"mocha": "ts-mocha -p library/tsconfig.json library/test/**/*.ts"
},
launch.json
{
"type": "node",
"request": "launch",
"name": "Mocha Tests",
"runtimeArgs": [
"${workspaceFolder}/node_modules/ts-mocha/bin/ts-mocha",
"--timeout", "999999",
"-p",
"${workspaceFolder}/library/tsconfig.json",
"${workspaceFolder}/library/test/**/*.ts"
],
"internalConsoleOptions": "openOnSessionStart"
}
and gulp.js just incase you want to use gulp too
const gulp = require('gulp');
const ts = require('gulp-typescript');
const mocha = require('gulp-mocha');
const tsProject = ts.createProject('tsconfig.json');
gulp.task('build', () => tsProject.src()
.pipe(tsProject())
.js.pipe(gulp.dest('dist')));
gulp.task('test', () => gulp.src('test/*.spec.ts')
.pipe(mocha({
reporter: 'nyan',
require: ['ts-node/register'],
})));
/* single command to hook into VS Code */
gulp.task('default', gulp.series('build', 'test'));
Don't use this answer. typescript-require is unmaintained, and ts-node is its replacement. Leaving this answer here for posterity.
Found it. The typescript
module is actually like a "main" function; it runs the compiler as soon as the module is loaded. Not very nice design.
I poked at Mocha's acceptance tests, which show how to use a custom compiler for foo
files. They wire it up via the require.extensions
mechanism. I was halfway through writing a module that just calls tsc
on the command line when I realized that somebody must have done this before. So it's very simple:
$ npm install typescript-require --save-dev
$ mocha --compilers ts:typescript-require
For anybody who has tried and had problems with typescript-require you may want to try ts-node.
$ npm install -g ts-node
$ mocha --require ts-node/register src/**/*.spec.ts
It also appears that there has been some ongoing discussion about deprecating typescript-require in favor of ts-node.