3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

jest.isolateModules() を使ってモジュールの振る舞いをテストケース内に閉じ込める

Posted at

はじめに

jest.isolateModules(fn) を利用すると、モジュールの振る舞いをテストケース内に閉じ込め、テストごとに独立した試験をすることが可能になります。

使い所としては、process.envの値によって振る舞いが変わるモジュールのテストなどで便利です。

サンプルとして、 jestで現在時刻を固定化する で使った Date オブジェクトがテストケース内で固有のものになるようにしてみます。12

使い方

const moment = require('moment')
// 固定したい時間
const MOCKED_TIME = '2019/8/1 12:00:00';

describe('モックした現在時刻のテスト', () => {
  // setup
  const OriginalDate = Date; // 退避
  const now = new OriginalDate(MOCKED_TIME);

  beforeEach(()=> {
    // 各テストケースの中では固有のDateにする
    jest.isolateModules(() => {
      // Date.now() と new Date() のみmocking
      Date.now = jest.fn().mockReturnValue(now.valueOf());
      jest.spyOn(global, 'Date').mockImplementation((arg) => {
        if (arg === 0 || arg) {
          return new OriginalDate(arg);
        }
        return now;
      });
    });
  });
  afterAll(() => {
    jest.restoreAllMocks();
  });


  test('現在時刻をYYYY/MM/DDの形式で表示できる', () => {
    const actual = moment().format('YYYY/MM/DD');
    expect(actual).toBe('2019/08/01');
  });

  test('Dateコンストラクタで現在時刻が固定化される', () => {
    const actual = new Date();
    expect(actual.valueOf()).toBe(now.valueOf());
  });

  test('Dateコンストラクタで時刻を指定できる', () => {
    const actual = new Date(0);
    expect(actual.valueOf()).toBe(0);
  });
})

describe('現在時刻がモックオブジェクトになっていないことのテスト', () => {
  test(`現在時刻は${MOCKED_TIME}ではない`, () => {
    const now = new Date();
    expect(now).not.toBe(new Date(MOCKED_TIME));
    expect(moment(now).format('YYYY/MM/DD HH:mm:ss')).not.toBe(MOCKED_TIME);
  });
})

image.png

  1. jest.spyOn で作成したモックは restoreAllMocks ではもとに戻せない が、試験終了後に mockFn.mockRestore() を呼ぶようにするとこのサンプルと同じことが可能です

  2. コード https://github.com/ryo-rm/TIL/tree/master/jest/001

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?