Jest builder for Angular build facade
ng test with Jest instead of Karma & Jasmine.
The builder comes to provide zero configuration setup for Jest while keeping the workspace clear of boilerplate code.
This documentation is for the latest major version only
- Remove Karma related libraries and files:npm remove karma karma-chrome-launcher karma-coverage-istanbul-reporter karma-jasmine karma-jasmine-html-reporterrm ./karma.conf.js ./src/test.ts
- Install the builder (and
jestif you still haven't):
npm i -D jest @types/jest @angular-builders/jest
Updating Typescript configurations
In tsconfig.spec.json (root directory, used by Jest):
You want your tests to be type-checked against Jest typings and not Jasmine.
This file was responsible for Karma setup, you don't need it here anymore.
In tsconfig.json (root directory, used by IDE):
Although you run your unit tests with Jest, Protractor (e2e tests) still has to use Jasmine. Due to this fact it’s possible that you favorite IDE will get confused with the typings and will propose you Jasmine types in unit tests.
tsconfig.jsonis the config file that your IDE uses so you have to instruct it explicitly to use Jest typings.
Bear in mind that the other side of the coin is that your IDE will propose you Jest types in your e2e tests.
Running with Angular CLI
- In your
angular.json:"projects":..."[your-project]":..."architect":..."test":"builder": "@angular-builders/jest:run""options":... //see below
- Run the tests:
Ivy compiler is enabled by default in version 9 so if you use it, make sure you run
ngcc in a
postinstall hook. For more details refer to this issue.
Multi-projects workspace support
The builder supports multi-project workspaces out of the box, the only thing required is editing tsconfig.spec.json in the relevant project directory as described above.
configPath- path to jest config file, relative to project root (or src/ directory in case of non-project app), defaults to
jest.config.js. The configuration is merged on top of the default configuration, so there is no need to specify the whole jest configuration in this file. Just specify the changes you'd like to make to the default configuration. The way the configurations are merged is as following:
- Take the default configuration from the library
- Add on top of it default project specific config (that is dynamic due to different root directories). Used to scope single project test runs.
- Add on top of it package.json jest config if exists (for all projects) or jest.config.js from workspace root directory if exists
- Add on top of it project specific config if it is specified inside angular.json or jest.config.js from project directory (or src/ directory in case of non-project app) if exists.
Thus, if you don't provide
configPathin options, and you'd like to customize the configuration of a single project in your workspace, you only have to add jest.config.js in this project's root directory and specify the configuration delta in this file.
Or, if you'd like the same custom configuration to be applied to all the projects in the workspace, you just specify it in package.json. Another option in such a case is creating a single config file in the workspace root and specifying it in angular.json for each project.
tsConfig- path to tsconfig file. If the path is relative then it is evaluated relative to the project root. Defaults to
tsconfig.spec.jsonthat is located in project root.
[jest-cli-option]- any option from Jest CLI options. For example, to run unit tests without caching and with
These options can also be provided directly to
ng testcommand. For example, to run a single test from this suite:;
Use the following command:
ng test --testNamePattern="My cool suite Should do one thing"
Migrating existing tests to Jest
Use this for automatic migration of your Jasmine tests to Jest framework.
Please find below a selection of potential issues you might face when using this builder. Refer to jest-preset-angular Troubleshooting for
jest-preset-angular specific issues.
Unexpected token [import|export|other]
This means that the library you're using doesn't use
commonjs module format (which
jest expects to see). You will need to implement the recommendations mentioned in jest-preset-angular Troubleshooting Guide.
One of the recommendations might require you to transpile js files through babel-jest.
In this case make sure you add
allowSyntheticDefaultImports to the
ts-jest configuration (see here for an explanation of this setting).
'ts-jest':// other options here...allowSyntheticDefaultImports: true
jest.config.js file should look something like this:
const esModules = '[thir-party-lib]';moduleexports =globals:'ts-jest':allowSyntheticDefaultImports: truetransformIgnorePatterns: `<rootDir>/node_modules/(?!)`transform:'^.+\\.js$': 'babel-jest';