開発覚書はてな版

個人的な開発関連の備忘録

【Jest】mockdateを使用したサンプル

概要

  • Jest 24.9 では jasmine.clock().mockDate のように Dateをテスト用に上書き機能がありません。
  • mockdate ライブラリを利用して jasmine.clock().mockDate() を代用できます。

実行環境

  • Node.js - 10.x
  • Yarn - 1.13.x

使用ライブラリ

  • Jest - 24.9.x
  • mockdate - 2.0.x
  • ts-jest - 24.0.x

設定方法

  • テスト実行時に mockdate.set() メソッドを使用してテスト用のDateを設定する。
  • Jest の setupFilesAfterEnv で初期化用ファイルを指定する。初期化用ファイル内で beforeEach() を定義して、その処理内で mockdate.reset() を実行する。

サンプル

package.json

{
  // jest設定のみ抜粋
  "jest": {
    "testEnvironment": "node",
    "verbose": true,
    "moduleFileExtensions": [
      "ts",
      "tsx",
      "js"
    ],
    "transform": {
      "^.+\\.(ts|tsx)$": "ts-jest"
    },
    "globals": {
      "ts-jest": {
        "tsConfig": "tsconfig.json"
      }
    },
    "testMatch": [
      "**/test/*.+(ts|tsx|js)"
    ],
    "setupFilesAfterEnv": [
      "./setup-clock-patch.ts"
    ]
  }
}

setup-clock-patch.ts

import * as mockdate from 'mockdate';

beforeEach(() => {
  mockdate.reset();
});

./test/date-test.ts

import * as mockdate from 'mockdate';

describe('Date', () => {
  it('now', () => {
    // setup
    mockdate.set(new Date(2019, 1, 1));

    // exercise
    const actual = Date.now();

    // verify
    expect(actual).toBe(new Date(2019, 1, 1).valueOf());
  });

  it('new Date()', () => {
    // setup
    mockdate.set(new Date(2019, 1, 1));

    // exercise
    const actual = new Date();

    // verify
    expect(actual.valueOf()).toBe(new Date(2019, 1, 1).valueOf());
  });

  it('mockdate reset check', () => {
    // exercise
    const actual = new Date();

    // verify
    expect(actual.valueOf()).not.toBe(new Date(2019, 1, 1).valueOf());
  });
});

サンプルソース一式

github.com

その他

  • mockdate.set()moment.js にも有効です。