jest.isolateModules() 를 사용하여 모듈의 동작을 테스트 케이스에 갇을 수 있습니다.

소개



jest.isolateModules(fn) 을 사용하면 모듈 동작을 테스트 케이스에 갇혀 각 테스트마다 독립적인 테스트를 수행할 수 있습니다.

사용소로서는, process.env 의 값에 의해 행동이 바뀌는 모듈의 테스트등으로 편리합니다.

샘플로서, jest로 현재 시간 고정 로 사용한 Date 오브젝트가 테스트 케이스내에서 고유의 것이 되도록(듯이) 해 봅시다. 1 2

사용법


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);
  });
})




jest.spyOn 에서 만든 모의는 restoreAllMocks 에서 원래 되돌릴 수 없다 하지만 시험 종료 후 mockFn.mockRestore() 을 부르게 하면 이 샘플과 같은 것이 가능합니다.

코드   htps : // 기주 b. 코 m / 료 rm / 치 L / t 리에 / 마 s r / ㅈ st / 001

좋은 웹페이지 즐겨찾기