Ви можете використовувати кастинг типу, і ви 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;
Якщо ви не хочете використовувати автоматичний макет і віддаєте перевагу створити його вручну
import TestedClass from './TestedClass';
import TestedClassDependency from './TestedClassDependency';
const testedClassDependencyMock = jest.fn<TestedClassDependency>(() => ({
}));
it('Should throw an error when calling playSomethingCool', () => {
const testedClass = new TestedClass(testedClassDependencyMock());
});
testedClassDependencyMock()
створює знущаний екземпляр об'єкта
TestedClassDependency
може бути або класом, або типом, або інтерфейсом