別のファイルで依存関係を持つモジュールをテストし、そのモジュールを に割り当てると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
クラス、型、またはインターフェースのいずれかになります。