開発覚書はてな版

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

【Jest】jasmine.clock().mockDate()を拡張して使用する

概要

  • Jest で jasmine.clock().mockDate() を使用するための拡張のサンプルです。
  • MockDate を使用して実現しています。
  • Date.now()new Date()moment() などの値が MockDate により上書きされます。
  • ちなみに Jestでは Jasmine記法でのテストコード実装が可能です。jasmine.createSpy なども使用できます。 jasmine.clock().mockDate() も型参照はできますが 実行時に undefined になります。

前回の記事

kakkoyakakko2.hatenablog.com

実行環境

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

使用ライブラリ

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

設定方法

  • jest.config.jssetupFilesAfterEnv で指定したファイル内で jasmine.clock().mockDate() を拡張します。
  • jasmine.clock().mockDate() 拡張時に mockdate.set() を呼び出して日時を上書きます。

サンプル

jest.config.js

module.exports = {
  "testEnvironment": "node",
  "verbose": true,
  "moduleFileExtensions": [
    "ts",
    "tsx",
    "js"
  ],
  "transform": {
    "^.+\\.(ts|tsx)$": "ts-jest"
  },
  "globals": {
    "ts-jest": {
      "tsConfig": "tsconfig.json"
    }
  },
  "testMatch": [
    "**/test/*.+(ts|tsx|js)"
  ],
  "resetMocks": true,
  "setupFilesAfterEnv": [
    "./setup-clock-patch.ts"
  ]
};

setup-clock-patch.ts

import * as mockdate from 'mockdate';

// jasmine.clock().mockDate defined
jasmine.clock = () => {
  return {
    mockDate: (date) => {
      mockdate.set(date);
    }
  } as any;
};

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

test/data-test.ts

describe('Date', () => {
  it('now', () => {
    // setup
    jasmine.clock().mockDate(new Date(2019, 1, 1));

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

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

  it('new Date()', () => {
    // setup
    jasmine.clock().mockDate(new Date(2019, 2, 1));

    // exercise
    const actual = new Date();

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

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

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

サンプルソース一式

github.com

参考URL

jestjs.io

www.npmjs.com