web-dev-qa-db-ja.com

タイプスクリプトを使用したjestの依存関係のモック

別のファイルに依存関係があるモジュールをテストするとき。そのモジュールをjest.Mockに割り当てると、TypeScriptはmockReturnThisOnceメソッド(または他のjest.Mockメソッド)が依存関係に存在しないというエラーを出します。これは以前に入力されたためです。 TypeScriptにjest.Mockから型を継承させる適切な方法は何ですか?

以下に簡単な例を示します。

依存

const myDep = (name: string) => name;
export default myDep;

test.ts

import * as dep from '../depenendency';
jest.mock('../dependency');

it('should do what I need', () => {
  //this throws ts error
  // Property mockReturnValueOnce does not exist on type (name: string)....
  dep.default.mockReturnValueOnce('return')
}

これは非常に一般的なユースケースであり、これを正しく入力する方法がわからないように感じます。どんな助けでも大歓迎です!

28
Philip Chmalts

型キャストを使用でき、test.tsは次のようになります。

import * as dep from '../dependency';
jest.mock('../dependency');

const mockedDependency = <jest.Mock<typeof dep.default>>dep.default;

it('should do what I need', () => {
  //this throws ts error
  // Property mockReturnValueOnce does not exist on type (name: string)....
  mockedDependency.mockReturnValueOnce('return');
});

TSトランスパイラーは、jest.mock('../dependency');depの型を変更することを認識していないため、型キャストを使用する必要があります。インポートされたdepは型定義ではないため、typeof dep.defaultでその型を取得する必要があります。

JestとTSでの作業中に見つけた他の便利なパターンを次に示します。

インポートされた要素がクラスの場合、たとえばtypeofを使用する必要はありません。

import { SomeClass } from './SomeClass';

jest.mock('./SomeClass');

const mockedClass = <jest.Mock<SomeClass>>SomeClass;

このソリューションは、いくつかのノードネイティブモジュールをモックする必要がある場合にも役立ちます。

import { existsSync } from 'fs';

jest.mock('fs');

const mockedExistsSync = <jest.Mock<typeof existsSync>>existsSync;

Jest自動モックを使用したくなく、手動のモックを作成したい場合

import TestedClass from './TestedClass';
import TestedClassDependency from './TestedClassDependency';

const testedClassDependencyMock = jest.fn<TestedClassDependency>(() => ({
  // implementation
}));

it('Should throw an error when calling playSomethingCool', () => {
  const testedClass = new TestedClass(testedClassDependencyMock());
});

testedClassDependencyMock()は、モックされたオブジェクトインスタンスを作成しますTestedClassDependencyは、クラス、型、またはインターフェイスのいずれかです

44
Artur Górski

Mockedのtype defのすぐ上の@ types/jest/index.d.tsのパターンを使用します(行515):

import { Api } from "../api";
jest.mock("../api");

const myApi: jest.Mocked<Api> = new Api() as any;
myApi.myApiMethod.mockImplementation(() => "test");
9
adanilev