Jest でコンストラクタを Mock する

2020.10.11

TL;DR

オブジェクトを返す関数を渡してやれば良い。

解説

公式読めよって話なのですが、

コンストラクタ関数をモックするためには、モジュールファクトリはコンストラクタ関数を返さなければなりません。 言い換えると、モジュールファクトリは関数を返す関数、つまり高階関数 (high-order function; HOF) でなければなりません。

https://jestjs.io/docs/ja/es6-class-mocks

とあるので、その通りに実装してあげれば良いようです。例えば以下のような感じに。

jest.mock('./MockTarget'); // Mockしたいモジュールが存在するファイルへのパスを指定
const Mock: jest.Mock = MockTarget as unknown as jest.Mock; // TypeScriptでは型変換する必要がある

/* mockImplementation に渡す関数がコンストラクタ */
Mock.mockImplementation(() => {
    /* do something */

    /* Mock を実装したオブジェクトを返す */
    return {
        /* Method の記述 */
        func: () => {
        }
    };
});