別のファイルに依存関係があるモジュールをテストするとき。そのモジュールを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')
}
これは非常に一般的なユースケースであり、これを正しく入力する方法がわからないように感じます。どんな助けでも大歓迎です!
型キャストを使用でき、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
でその型を取得する必要があります。
インポートされた要素がクラスの場合、たとえば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
は、クラス、型、またはインターフェイスのいずれかです
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");