TypeScript を使用した Jest の依存関係のモック 質問する

TypeScript を使用した Jest の依存関係のモック 質問する

別のファイルで依存関係を持つモジュールをテストし、そのモジュールを に割り当てるとjest.mock、TypeScript は、メソッドmockReturnThisOnce(またはその他のjest.mockメソッド) が依存関係に存在しないというエラーを返します。これは、メソッドが以前に型指定されているためです。

TypeScript に型を継承させる適切な方法は何ですかjest.mock?

ここに簡単な例を示します。

依存

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

テスト.ts

import * as dep from '../dependency';
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')
}

これは非常に一般的な使用例のように思えますが、これを適切に入力する方法がわかりません。

ベストアンサー1

型キャストを使用すると、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');
});

jest.mock('../dependency');TS トランスパイラはの型の変更を認識しないため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クラス、型、またはインターフェースのいずれかになります。

おすすめ記事