in Software Development #Node.js

Mocha tests hang after tests have finished

Recently, while revisiting a Node.js repository I haven't contributed to in ages, I encountered a new problem: the Mocha tests would hang instead of exiting. When I asked about the error, it seems it was recently introduced and nobody had pursued tracking down the root cause of the issue.

Conveniently, this issue was only happening locally, and our CI/CD build pipeline was not affected. Because of this, I also took the low road and decided to leave the sleuthing for another day.

The root cause is more than likely a stream that remained open. This really should be torn down as part of the after code for whichever test was utilizing it. Ideally, the software engineer(s) should have identified this during development, but with the build pipeline not affected, it slipped through.

Engineering best practices aside, the issue itself is a minor one, really only affecting my ability to run the tests I was writing locally. I could certain hit CTRL+C at the end of every test run, but that gets old fast.

Command-line arguments to the rescue

The solution? Fortunately, mocha has a command-line argument you can pass in to tell it to force an exit after the test suite has run. This can be found by passing in --help:

% npx mocha --help
mocha [spec..]

Run tests with Mocha

Commands mocha inspect [spec..] Run tests with Mocha [default] mocha init path> create a client-side Mocha setup at path>

Rules & Behavior --allow-uncaught Allow uncaught errors to propagate [boolean] -A, --async-only Require all tests to use a callback (async) or return a Promise [boolean] -b, --bail Abort ("bail") after first test failure [boolean] --check-leaks Check for global variable leaks [boolean] --delay Delay initial execution of root suite [boolean] --dry-run Report tests without executing them [boolean] --exit Force Mocha to quit after tests complete [boolean]

... even more arguments and resources

Armed with this command-line argument, running mocha --exit would run my tests and exit as I would expect them to.