1. ホーム
  2. node.js

[解決済み] Typescript と Jest。モックされた関数の型エラーを回避する

2023-02-04 15:52:36

質問

Jestで外部モジュールのモックを作成したい場合、Jestでは jest.mock() メソッドを使って、モジュール上の関数を自動モックすることができます。

そして、モックされたモジュール上のモックされた関数を好きなように操作したり問い合わせたりすることができます。

たとえば、次のように axios モジュールをモックする例を考えてみましょう。

import myModuleThatCallsAxios from '../myModule';
import axios from 'axios';

jest.mock('axios');

it('Calls the GET method as expected', async () => {
  const expectedResult: string = 'result';

  axios.get.mockReturnValueOnce({ data: expectedResult });
  const result = await myModuleThatCallsAxios.makeGetRequest();

  expect(axios.get).toHaveBeenCalled();
  expect(result).toBe(expectedResult);
});

上記はJestでは問題なく実行されますが、Typescriptのエラーを投げます。

プロパティ 'mockReturnValueOnce' はタイプ '(url: string, config? AxiosRequestConfig | undefined) => AxiosPromise'に存在しません。

の型定義は axios.get には、正しく mockReturnValueOnce プロパティを含んでいません。私たちは、Typescript に axios.get をオブジェクトリテラルとして扱うように強制することができます。 Object(axios.get) ということになりますが

型安全性を維持しながら関数をモックするイディオム的な方法は何でしょうか?

どのように解決するのですか?

次のコードを追加してください。 const mockedAxios = axios as jest.Mocked<typeof axios> . そして、mockedAxiosを使用してmockReturnValueOnceを呼び出します。 あなたのコードでは、このように実行されるはずです。

import myModuleThatCallsAxios from '../myModule';
import axios from 'axios';

jest.mock('axios');
const mockedAxios = axios as jest.Mocked<typeof axios>;

it('Calls the GET method as expected', async () => {
  const expectedResult: string = 'result';

  mockedAxios.get.mockReturnValueOnce({ data: expectedResult });
  const result = await myModuleThatCallsAxios.makeGetRequest();

  expect(mockedAxios.get).toHaveBeenCalled();
  expect(result).toBe(expectedResult);
});