【发布时间】:2020-02-26 14:24:27
【问题描述】:
我正在 Typescript 项目中使用 Jest 创建一个自定义模拟(ES6 类)。模拟创建了几个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 在尝试导入模拟的 mockPlaySoundFile 函数时通知错误(这对我来说很有意义)。那是因为mockPlaySoundFile 显然不存在于soundPlayer.ts 中。但是由于 jest.mock('../soundPlayer'); 模拟是在后台导入的,因此导出确实存在。
有没有办法通知 TS 在这种情况下查看模拟?
【问题讨论】:
-
这个线程有很多很好的例子来说明如何做到这一点:stackoverflow.com/questions/48759035/… 你可以使用来自 ts-jest 的
mocked助手:github.com/kulshekhar/ts-jest/blob/master/docs/user/…
标签: typescript mocking jestjs