Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

Jest でステートを持ったモジュールをテスト毎に初期化したい

private でステートを持ったモジュールのテストをするとき、初期化用のメソッドを作っていませんか? 実は jest では内部ステートをリセットする方法があります。

やり方

やり方は単純で、require('./myModule') でモジュールを読み込み、各テストの前に jest.resetModules() を行うだけです。

例えばメモ化した関数のテストを考えます。当然、各テスト毎にメモ化状況はリセットしたいです。

export const memoizedFunc = memoize(f);
// import { memoizedFunc } from './myModule'; // これの代わりに
describe('memoizedFunc', () => {
  // beforeEach でテスト毎に require し直す
  let memoizedFunc;
  beforeEach(() => {
    jest.resetModules();
    memoizedFunc = require('./myModule').memoizedFunc;
  });
  test('case1', () => {
    /* ステートがリセットされている */
  });
  test('case2', () => {
    /* ステートがリセットされている */
  });
});

let memoizedFunc; から始まる5行を足すだけでテスト自体は書き直す必要がありません。簡単ですね。

参考

javascript - how to reset module imported between tests - Stack Overflow