Ответ 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');
});
Транспортер 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>(() => ({
// implementation
}));
it('Should throw an error when calling playSomethingCool', () => {
const testedClass = new TestedClass(testedClassDependencyMock());
});
testedClassDependencyMock()
создает экземпляр макета объекта
TestedClassDependency
может быть классом, типом или интерфейсом