Debugging ES6 Mocha unit tests using VS Code
The world of Mocha, VS Code and Node is still fairly new to me. Typically in the past all my JS unit tests have been debuggable in-browser using DevTools, but with Mocha this is not the case (As I am not deploying my spec files). I got Mocha to load via a launch config, but it would not originally work due to using ES6 directly.
If you do not have a launch.json, start here. Otherwise skip to the next section. Add a new Debug Configuration by selecting “Debug”, and then “Add Configuration”. Selecting “Node.js” automatically creates a “launch.json” under a root folder named .vscode. If you already had debug set up, this step would be irrelevant.
Add Mocha configuration to launch.json
In the launch.json, much like the surprisingly helpful comments suggest, you can simply type “Mocha” then [ctrl]+[space] to bring up the intellisense for a Mocha configuration!
Which will insert the appropriate snippet.
Now, in theory it is as simple as clicking the play icon in debug, with “Mocha Tests” selected.
Supporting ES6.
For me however, this didn’t work.
The issue here is that I get a lot of unexpected token errors as my tests are using ES6 and I suspect that by default it wants to use ES5. The issue of using ES6 for unit tests was resolved in another post .
Much like my previous post, I can update the launch arguments to use require to pull in the same 2 Babel modules, and will also specify a wild card file name of my tests so it doesn’t pick up any other code.
{
"type": "node",
"request": "launch",
"name": "Mocha Tests",
"program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
"args": [
"./test/**/*.spec.js",
"--require", "@babel/polyfill",
"--require", "@babel/register",
"-u",
"tdd",
"--timeout",
"999999",
"--colors",
],
"internalConsoleOptions": "openOnSessionStart"
}
Now for me, this also didn’t work as I am using Chai for my BDD test syntax.
For this I had to change “tdd” to “bdd” under the args.
Now I can attach and debug, providing a breakpoint is set!
Thank you!!!
It would be good if you replaced “tdd” with “bdd” right in the example though.