Я создаю пользовательский макет (из класса ES6) с Jest в проекте Typescript. Макет создает конечные экспорты на несколько mock.fn()
, чтобы их можно было отслеживать в наборе тестов.
Примером может быть официальный документ из документации Jest (https://jestjs.io/docs/en/es6-class-mocks#manual-mock). Там SoundPlayer
класс был проверен, так как это единственный метод playSoundFile
. Метод проверяется с помощью jest.fn()
, который экспортируется для использования в тестах.
// soundPlayer.ts
export default class SoundPlayer {
foo: string = 'bar';
playSoundFile(filename: string) {
console.log(`Playing sound file ${filename}`);
}
}
// __mocks__/soundPlayer.ts
export const mockPlaySoundFile = jest.fn();
const mock = jest.fn().mockImplementation(() => {
return { playSoundFile: mockPlaySoundFile };
});
export default mock;
// __tests__/soundPlayer.ts
import SoundPlayer, { mockPlaySoundFile } from '../soundPlayer';
jest.mock('../soundPlayer');
beforeEach(() => {
mockPlaySoundFile.mockClear();
});
it('is called with filename', () => {
const filename = 'song.mp3';
const soundPlayer = new SoundPlayer();
soundPlayer.playSoundFile(filename);
expect(mockPlaySoundFile).toBeCalledWith(filename);
});
Тест работает, как и ожидалось, но TS уведомляет об ошибке (что для меня имеет смысл) при попытке импортировать ложную функцию * 1014. * Это потому, что, очевидно, mockPlaySoundFile
не существует в soundPlayer.ts
. из-за jest.mock('../soundPlayer');
макет импортируется из-под капота, поэтому экспорт существует.
Есть ли способ сообщить TS, чтобы он смотрел на макеты в подобных случаях?