Setup unit testing for TypeScript with Jest
npm i -D jest typescript ts-jest @types/jest serve onchange @types/node @types/jest source-map-support @types/source-map-support
The official docs: https://jestjs.io/docs/en/getting-started
To get info about your install run:
npx envinfo --preset jest
add config file jest.config.js
module.exports = {
preset: 'ts-jest',
// The test environment that will be used for testing
testEnvironment: "node",
roots: [
"<rootDir>"
],
"modulePaths": [
"<rootDir>",
],
"moduleDirectories": [
"node_modules"
],
testMatch: [
"**/__tests__/**/*.+(ts|tsx|js)",
"**/__tests__/**/?(*.)+(spec|test).+(ts|tsx|js)",
"**/?(*.)+(spec|test).+(ts|tsx|js)"
],
transform: {
"^.+\\.(ts|tsx)$": "ts-jest",
"^.+\\.(js|jsx|ts)$": "babel-jest"
},
coverageReporters: ['json', 'lcov', 'text', 'clover']
common errors
No tests found, exiting with code 1
the roots
is where the test files are located.
If you get this error then change roots to jest knows where your test files are.
For example, Its common to have a directory tests with all your tests and for your code to be in a src directory so your config would look like this:
{
roots: ["<rootDir>/src/", "<rootDir>/__tests__/"],
}
In you package.json add a test command so you can run your tests with npm run test
"scripts": {
"test": "jest --coverage",
"test:watch": "jest --coverage --watchAll",
"view:coverage": "serve coverage/lcov-report",
"clean": "rm -rf coverage /**/*.js src/**/*.map",
"tsc": "tsc",
"build:watch": "onchange '**/*.ts' -- npm run tsc"
},
my tsconfig.js file looks like this
{
"compilerOptions": {
"outDir": "./dist/",
"sourceMap": true, // To generate source maps during compilation
"noImplicitAny": false,
"module": "commonjs",
"target": "es6",
"jsx": "react",
"skipLibCheck": true
}
}
tests
if this exists with a 0 then all is well.
and finally create your first test
mytest.test.ts
expect(1+1).toBe(1);
});
You might find it helpful to have open threes console windows with each running:
npm run test:watch
This automatically runs all the tests on every file save. Very important to re-test your application on every change, especially with TypeScript, as the purpose of following types through a large application is what TS is good at.npm run build:watch
Have tsc running after every save as well. Used for a CICD set to transpile the TS to JS. This is configured by the tsconfig.json file.npm run start
This starts the app. Since we added a module called source-map-support, our error messages will reflect our TS line of code.