jest.mock()の使い方!モジュールをモック化する方法を説明します!

Jestのjest.mock()はモジュールのモックを作成するための関数です。この関数を使用することで、テスト対象のモジュール全体または一部を上書きし、テストケースでカスタムの動作を定義できます。

この記事ではjest.mock()を用いて、

  • モジュールの全部をモック化する方法
  • モジュールの一部をモック化する方法

などをプログラム例を用いて分かりやすく説明するように心掛けています。ご参考になれば幸いです。

jest.mock()を用いて、モジュールの全部をモック化する方法

以下の「テスト対象のファイル(sample.js)」に記述しているhello()関数とgoodbye()関数を「テストファイル(sample.test.js)」でモック化する方法を説明します。

sample.js

function hello() {
  return 'Hello';
}
function goodbye() {
  return 'Goodbye';
}
module.exports = { hello, goodbye };

jest.mock()の第1引数に対象のモジュールパスを記述することで、モジュール全体をモック化することができます。

以下の「テストファイル(sample.test.js)」では、jest.mock(‘./sample.js’)と記述することで、sample.jsモジュール全体をモック化し、hello()関数とgoodbye()関数に対して、mockImplementationを使用してカスタムの戻り値を設定しています。

sample.test.js

const { hello, goodbye } = require('./sample.js');

// sample.js モジュールをモック化
jest.mock('./sample.js');

describe('Sample Module', () => {
  it('モック化できているかのテスト', () => {
    // hello()関数をモック化し、戻り値を設定
    hello.mockImplementation(() => 'Mocked Hello');

    // goodbye()関数もモック化し、戻り値を設定
    goodbye.mockImplementation(() => 'Mocked Goodbye');

    // モック関数を呼び出す
    const helloResult = hello();
    const goodbyeResult = goodbye();

    // モック関数の戻り値をテスト
    expect(helloResult).toBe('Mocked Hello');
    expect(goodbyeResult).toBe('Mocked Goodbye');
  });
});

jest.mock()を用いて、モジュールの一部をモック化する方法

次に、モジュールの一部をモック化する方法を説明します。例えば、hello()関数のみモック化する場合には、jest.mock()を以下のように書き換えます。以下のプログラムでは、jest.requireActual()を用いて、実際のモジュールをインポートし、hello()関数のみモック化しています。

その結果、hello()関数は指定された戻り値を返し、goodbye()関数は実際の実装を使用します。

const { hello, goodbye } = require('./sample.js');

// sample.js モジュールをモック化
jest.mock('./sample.js', () => {
  const originalModule = jest.requireActual('./sample.js'); // 実際のモジュールをインポート
  return {
    ...originalModule,
    hello: jest.fn(() => 'Mocked Hello'), // hello()関数をモック化し、戻り値を設定
  };
});

describe('Sample Module', () => {
  it('should mock hello() function and not mock goodbye() function', () => {
    // モックされたhello()関数を呼び出す
    const helloResult = hello();
    // hello()関数の戻り値をテスト
    expect(helloResult).toBe('Mocked Hello');

    // goodbye()関数はモック化されていないため、実際の実装が呼ばれる
    const goodbyeResult = goodbye();
    // goodbye()関数の戻り値をテスト
    expect(goodbyeResult).toBe('Goodbye');
  });
});

本記事のまとめ

この記事ではjest.mock()を用いて、

  • モジュールの全部をモック化する方法
  • モジュールの一部をモック化する方法

を説明しました。お読み頂きありがとうございました。