imocha

Standalone watch mode for mocha.

Usage no npm install needed!

<script type="module">
  import imocha from 'https://cdn.skypack.dev/imocha';
</script>

README

imocha

npm version Build Status Coverage Status Depfu

In development - work in progress!

Run tests associated to changed files (based on git status).

$ npm install --save-dev imocha

or...

$ yarn add -D imocha

You can also choose to install it globally (npm install -g imocha) or run it through npx (npx imocha). If you have a global imocha and run it on a project that has its own version of imocha, the project local version will automatically be used.

If you have a project using mocha and you want to try out imocha without installing it into your project, you can run:

$ npx imocha

Description

When the cli is started, it will map out the test files and each of the source files that they depend on - this is done through the SourceGraph class.

Then it looks at the dirty files (determined by running git status) and checks which of the test files would be relevant to run based on which files has been changed.

The tests are being run by mocha itself - a process is forked off from which mocha is loaded. This happens on every single run to make sure that there is no pollution between test runs. This is the responsibility of the MochaWorker class.

The orchestration of the above, and the watching of files are handled within the MochaWatch class.

Tips

Debugging tests that aren't being picked up

If you experience that some of your tests aren't being executed where they should, try running imocha with a DEBUG environment variable with the value true:

$ DEBUG=true imocha

This will output debug information from imocha, and among that it will report about require and import statements that it saw, but could not resolve. It could as an example be caused by calling require with a variable as the value, which would be reported as such:

Unmatched relation: Non literal require. (in /path/to/file.js:18:29)

Known limitations

Dynamic imports

With require it is possible to do dynamic imports. This tool only supports dependencies that are statically analyzable.

// This will not work...

const pathToModule = "../myModule";
require(pathToModule);