【发布时间】:2020-07-30 16:27:33
【问题描述】:
我正在尝试模拟一个 npm 包实现,既要返回解析为 true 的 Promise,又要返回另一个测试,我想以错误拒绝。
在测试文件的顶部,在第一个测试描述之前,我定义了以下代码来模拟一个 npm 包:
const mockNewFile = (): File => new File(['this is new file content'], 'new-file');
jest.mock('blueimp-load-image', () => () => {
const newFile = mockNewFile();
return new Promise(resolve => {
const data = {
image: {
toBlob: (func: (file: File) => File) => {
func(newFile);
}
}
};
resolve(data);
});
});
有了这个,我可以成功地为依赖于这个 npm 包的函数运行我的测试,称为 blueimp-load-image
但后来我想添加一个测试,看看如果这个 blueimp-load-image 函数失败会发生什么,也就是说,当它返回的承诺被拒绝时。
为此,我在测试文件的主要描述块中创建了一个新的描述块,并尝试在那里再次模拟 npm 包,让它返回一个不同的包:
describe('if loadImage returns an error', () => {
beforeEach(() => {
jest.mock('blueimp-load-image', () => () => {
return new Promise((resolve, reject) = reject(new Error('something went wrong')));
});
});
test('return the file back unmodified', async () => {
const expected = {/* file content */};
const result = await theFunctionUsingLoadImage(file);
expect(result).toStrictEqual(expected);
});
});
这里上面的测试失败了,因为似乎没有抛出任何错误,这导致我预计在 beforeEach 块中创建的模拟不起作用。我知道这一点是因为expected 和result 应该是相同的,只有在没有错误的情况下才会有所不同。
我也尝试使用 Jest.mock 的 jest.spyOn instado 来解决这个问题,但该尝试完全失败。
我错过了什么?
【问题讨论】:
标签: javascript unit-testing npm jestjs