🧪

Jest mockResolvedValueの型エラーを1分で解決

に公開

概要

個人開発中に該当のエラーに遭遇し、AIに尋ねたのですが回りくどい解決策を提案されてしまい、「初めから公式を参照した方が早かったな」という体験をしたため、記事として投稿することにしました。

https://jestjs.io/docs/mock-function-api#mockfnmockresolvedvaluevalue

問題

Jest + TypeScriptの組み合わせでmockResolvedValueを使うときに、下記のような型エラーに遭遇することがあります:

// ❌ 型エラー
const mockFn = jest.fn().mockResolvedValue({ id: 'test' });
// Error: 型 'object' の引数を型 'never' のパラメーターに割り当てることはできません

原因

このエラーの原因は、jest.fn()を型情報なしで呼び出すことです。TypeScriptが戻り値の型を推論できないため、mockResolvedValueの引数がnever型になってしまいます。

jest.fn() // → 型が不明
  .mockResolvedValue() // → 引数がnever型になる

解決方法

jest.fnに型引数を明示的に指定することで解決できます。

// ✅ 解決
import { jest } from '@jest/globals';

const mockFn = jest.fn<() => Promise<{ id: string }>>()
  .mockResolvedValue({ id: 'test' });

実際の使用例

実際のテストコードで見てみましょう。

Before: 型エラーが発生

jest.mock('./service', () => ({
  Service: jest.fn().mockImplementation(() => ({
    getData: jest.fn().mockResolvedValue({ result: 'success' })
  }))
}));

After: 型安全

interface Result {
  result: string;
}

const mockGetData = jest.fn<() => Promise<Result>>()
  .mockResolvedValue({ result: 'success' });

jest.mock('./service', () => ({
  Service: jest.fn().mockImplementation(() => ({
    getData: mockGetData
  }))
}));

さまざまなパターン

引数がある関数の場合

// 引数がある関数の型定義
const mockFnWithArgs = jest.fn<(id: string) => Promise<{ name: string }>>()
  .mockResolvedValue({ name: 'test user' });

複数の引数がある場合

const mockComplexFn = jest.fn<(id: string, options: { limit: number }) => Promise<Item[]>>()
  .mockResolvedValue([{ id: '1', name: 'item1' }]);

ポイント

  1. jest.fn<関数の型>()で型を明示
  2. 引数がある場合:jest.fn<(arg: string) => Promise<Result>>()

まとめ

Jest + TypeScriptでmockResolvedValueの型エラーが出たら、jest.fnに型引数を明示的に指定するだけで解決できます。この方法により、型安全性を保ちながらテストコードを書くことができます。

Discussion