コンテンツにスキップ

Jest

Jest は JavaScript/TypeScript のテストフレームワークである。

インストール

以下のコマンドを実行し、Jest をインストールする。

1
$ npm i -D jest ts-jest @types/jest

以下のコマンドを実行し、jest.config.jsを作成する。

1
$ npx ts-jest config:init

package.jsonに以下をマージしてnpm run testを実行できるようにする。

package.json
1
2
3
4
5
{
  "scripts": {
    "test": "jest"
  }
}

tsconfig.jsonに以下をマージする。これをしないと次の test()や expect()等でエラーが出る。

tsconfig.json
1
2
3
4
5
{
  "compilerOptions": {
    "types": ["jest"]
  }
}

テストコードを作成する

srcディレクトリ内に*.spec.tsとしてテストコードを書く。

1
2
3
4
5
6
7
describe("encrypt", () => {
  // 関連するテストをまとめるブロック
  test("test01", () => {
    // テスト
    expect(1 + 1).toBe(2);
  });
});

npm run testを実行する。

expectはテストケースに1つだけにすること。さもないとデバッグから始めることになる。(アサーションルーレット)

describe

いくつかの関連するテストをまとめるブロックを作成するためのメソッド。

it (test)

テスト。testitと同機能。

it()の前に事前処理を行いたい

セットアップと破棄 · Jest

beforeEach()を実装する。

1
2
3
beforeEach(() => {
  console.log("beforeEach");
});

ファイルの中で 1 回だけ事前処理を行いたい

セットアップと破棄 · Jest

beforeAll()を実装する。

1
2
3
beforeAll(() => {
  console.log("beforeAll");
});

toEqual()

オブジェクトを比較する際、toBe()はオブジェクトの参照を比較するが、 toEqual()はオブジェクトの中身まで含めた比較をする。

toBe()は JavaScript でいう{a: 100}=={a: 100}をやるらしい。参照が違うので結果は false になる。

一方でtoEqual()は中身まで見てくれるので楽。

JSON.stringify()して文字列で比較する必要はないらしい。

非同期で例外を返すことをテストする

1
2
3
4
// service.findOne("a")がテスト対象の非同期のメソッド(TodoNotFoundErrorの例外を返す想定)
it("findOne()の異常系テスト(存在しないidを渡す)", async () => {
  (await expect(service.findOne("a"))).rejects.toThrow(TodoNotFoundError);
});

ビルトインメソッドをモックする

以下でいけるらしい。(未確認)

1
const spy = jest.spyOn(Math, "random").mockImplementation(() => 0.1);

export function をモックする

React のテスト