【JS】【TS】JS単体試験ツール Jest ~ 基本編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2020/12/23/103209

の続き。

Jest を書いていて気になったTips的なものをメモする。

目次

【1】確認用メソッド
【2】その他メソッド
 1)each

【1】確認用メソッド

expectクラスの以下の一覧でどういったものがあるかが分かる。

公式サイト
https://jestjs.io/docs/ja/expect

ってゆーかー、ざっとでよければ、以下のサイトがめちゃ分かりやすい。

https://qiita.com/t-toyota/items/93cce73004b9f765cfcf

主なメソッド

1).toBe() ... 等しいかどうか
2).not ... 等しくない(e.g. expect(A).not.toBe(B);)
3).toBeNull() ... null かどうか
4).toBeTruthy() / .toBeFalsy() ... true/falseかどうか
5).toContain() ... 対象の期待の結果が含まれているかどうか
6).toThrow() / .toThrowError() ... 例外が発生したか

【2】その他メソッド

1)each

引数に従って結果を切り替えるメソッドをテストする際に便利!
以下、サンプル。

使用上の注意

* 許容できる引数は3つまで。(4つ以上だとエラーになった)
~~~~~~
it.each([
   ['Hi', 'Mike', 'Hi, Mike!!'], // OK
   ['Hi', 'Mike', '!!!' 'Hi, Mike!!'], // ERROR

ファイル構成

my-app << 対象プロジェクト
 + src
  |  + util
  |      + Hello.ts << テスト対象TypeScriptファイル
 + tests/unit
     + util
         + Hello.spec.ts << 単体テストファイル

Hello.ts

export default class Hello {
  static getHello(name: string): string {
    let message = 'Hello, World!'
    switch (name) {
      case "Mike":
      case "Tom":
        message = `Hi, ${name}!!`;
        break;
      default:
        // Go through
        break;
    }
    return message;
  }
}

Hello.spec.ts

import Hello from '../../../src/util/Hello';

describe("Hello tests", () => {
  describe("getHello() test", () => {
    it.each([
      ['Mike', 'Hi, Mike!!'],
      ['Tom', 'Hi, Tom!!'],
      ['Sam', 'Hello World!'],
    ])('name = %s, expected = %s', async (inputName: string, expected: string) => {
      const actual = Hello.getHello(inputName);
      expect(actual).toBe(expected);
    });
  });
});

補足:it.each() でエラーが発生した場合

環境によって、以下の「エラー内容」が発生する場合がある。

・発生したJestのバージョン:"@types/jest": "^24.0.19"
・発生しなかったJestのバージョン:"@types/jest": "^26.0.19"

【エラー内容】
Property 'each' does not exist on type 'TestFunction'.ts(2339)

【対応案】
(もっといい対応があると思うが)jest-each をインストールする

~~~~~~
npm i --save-dev jest-each
~~~~~~

https://www.npmjs.com/package/jest-each
修正版:Hello.spec.ts

import Hello from '../../../src/util/Hello';
import each from 'jest-each';

describe("Hello tests", () => {
  describe("getHello() test", () => {
    each([
      ['Mike', 'Hi, Mike!!'],
      ['Tom', 'Hi, Tom!!'],
      ['Sam', 'Hello, World!'],
    ]).test('name = %s, expected = %s', (inputName: string, expected: string) => {
      const actual = Hello.getHello(inputName);
      expect(actual).toBe(expected);
    });
  });
});

関連記事

JS単体試験ツール Jest ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/12/23/103209
JS単体試験ツール Jest ~ Mock編 ~
https://dk521123.hatenablog.com/entry/2021/01/26/215558
JS単体試験ツール Jest ~ キャッシュ関連 ~
https://dk521123.hatenablog.com/entry/2021/03/12/164932