Unit Testing with Typescript and Jest

muhajirdev

Muhammad Muhajir

Posted on November 9, 2018

Unit Testing with Typescript and Jest

vscode-jest

Originally published in https://muhajirframe.com/writing/unit-test-typescript-jest/

In this article we'll try to cover a simple unit testing in Typescript + jest.

We're going to create a simple utility that detect whether an url is internal link or external link.
For example https://www.google.com is an external link, while /page1 is an internal link. We're going to name the project is-internal-link, but you can name it anything.

Prerequisites

  • NodeJS
  • VSCode + Jest plugin (Optional)

Create new directory

mkdir is-internal-link
Enter fullscreen mode Exit fullscreen mode

Init npm

npm init
Enter fullscreen mode Exit fullscreen mode

Install dependencies

npm install --save-dev @types/jest @types/node jest ts-jest typescript
Enter fullscreen mode Exit fullscreen mode

Create jest.config.js

module.exports = {
  roots: ['<rootDir>/src'],
  transform: {
    '^.+\\.tsx?$': 'ts-jest',
  },
  testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
  moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
}
Enter fullscreen mode Exit fullscreen mode

Create tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "lib": ["es2015"],
    "strict": true,
    "declaration": true,
    "outDir": "dist",
    "sourceMap": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "**/*.spec.ts"]
}
Enter fullscreen mode Exit fullscreen mode

All right we're ready to write the code. Create file src/main.ts and src/main.spec.ts
Your files tree should now looks like this

.
├── node_modules
├── package-lock.json
├── package.json
├── src
│   ├── main.spec.ts
│   └── main.ts
└── tsconfig.json
Enter fullscreen mode Exit fullscreen mode

Open it in your favorite editor. (VSCode / Atom / Sublime / etc).
I personally use VSCode

import { isInternalLink } from './main'

test('should return false given external link', () => {
  expect(isInternalLink('https://google.com')).toBe(false)
})

test('should return true given internal link', () => {
  expect(isInternalLink('/some-page')).toBe(true)
})
Enter fullscreen mode Exit fullscreen mode

Now there's to way to test this.

Way 1

Open your package.json. And replace it your scripts with

 "scripts": {
    "test": "jest"
  },
Enter fullscreen mode Exit fullscreen mode

Run npm run test.
Now you should see the error because we haven't implemented the code yet right?

Way 2

With your editor's plugin. I prefer this way. I'll only show it on VSCode. Your favorite editor might have it too.

Install vscode-jest

vscode-jest
This GIF, should be self a great explanation how vscode-jest works

Let's continue.
vscode-jest

Your VSCode might now looks like this.

Implementing the code

Let's implement our main.ts

export const isInternalLink = (link: string) => /^\/(?!\/)/.test(link)
Enter fullscreen mode Exit fullscreen mode

Switch back to your main.spec.ts. You should see now the error is gone, and it turns green.

PRO TIPS: Use VSCode split editor to see the code (main.ts) and spec (main.spec.ts) at the same time.

TL;DR

Open main.ts on first side cmd+1 cmd+p main.ts

Open main.spec.ts on second side cmd+2 cmd+p1 main.spec.ts

Side note: I am a big fan of VSCode and Vim, And I have tons of tricks on How to Increase Your Productivity with VSCode. Let me know in the comment if you guys interested, I can write about it here

Congratulations!

You just did your Unit Testing with Typescript and Jest

💖 💪 🙅 🚩
muhajirdev
Muhammad Muhajir

Posted on November 9, 2018

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Unit Testing with Typescript and Jest
typescript Unit Testing with Typescript and Jest

November 9, 2018