DEV Community

Darragh O'Riordan
Darragh O'Riordan

Posted on • Originally published at darraghoriordan.com on

How I configure jest on a typescript node application

Here is some of the configuration I have for a node application in typescript that builds on a CI system

Installation

First, add jest! :)

ts-jest runs jest on typescript projects with type checking.

jest-junit outputs the test results in a format that reporting tools can use to show test results. This is useful for CI systems like CircleCI, AzureDevOps, Jenkins etc.

yarn add --dev jest ts-jest jest-junit
Enter fullscreen mode Exit fullscreen mode

package.json

in your package.json add some new settings. The first is a new script for running tests from npm.

If you accidentally leave an unresolved promise or unresolved async call while writing your code jest can get stuck. The --detectOpenHandles switch will have jest try to figure out what is preventing itself from stopping. It’s really helpful to have this when it’s needed.

--colors just adds some terminal colors!

...
    "scripts": {
      "test": "jest --detectOpenHandles --colors"
    }
    ...
Enter fullscreen mode Exit fullscreen mode

jest.config.js

The next file I add, in the root of my project is a jest-setup.js file. Note it is .js. This non-typescript file can cause issues with typescript expecting all source files to be in the src/ directory so you may have to ignore it in your tsconfig.json. This depends on your setup though, so if you don’t have a problem then don’t worry about it. If you get stuck let me know!

You can have ts-jest create this for you by using

yarn ts-jest config:init
Enter fullscreen mode Exit fullscreen mode

This is where we tell jest we want to use ts-jest, we’re running node.

The reporters are what jest uses to create output. default is just console (I think) and jest-junit has jest emit a junit.xml file containing all our test results in a well known, exportable format.

The setup file is specified here. Jest will load this file before running all of your tests so it’s the place to set up things you need for your tests to run successfully. You may not need one. See the details about mine below 👇.

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  reporters: ['default', 'jest-junit'],
  setupFiles: ['./jest.setup-file.ts'],
}
Enter fullscreen mode Exit fullscreen mode

jest.setup-file.ts

Here I have the setup file we referenced in jest.config.js

I have two reasons to use this file.

The first is because I use the winston logger and I don’t want it emitting logs while running my tests. They just clutter the results. You may want to turn this on or off from time to time but this is the way I like it.

The second reason is the graphql integrations I use need to use reflect-metadata at runtime. So I load it here before anything else. If you don’t need either of these things you may not need this file.

import 'reflect-metadata'
import * as winston from 'winston'

// don't log while running tests
winston.remove(winston.transports.Console)
winston.remove(winston.transports.File)
Enter fullscreen mode Exit fullscreen mode

And that’s it! You should be able to add your *.spec.ts files with tests now and jest will pick them up and run them when you use yarn test.

Top comments (0)