所以我一直在努力如何测试动态导入,在这种情况下,尤其是开 Jest ,我在互联网上阅读了很多,但没有找到任何具体的东西,所以我想提出这个问题来集中一个体面的解决方案.
我在一个类中有以下方法
class MyClass {
successMethod() { ... }
errorMethod() { ... }
myMethod() {
return import('./myFile.js')
.then(() => this.successMethod())
.catch(() => this.errorMethod());
}
}
我的问题是:您如何使用 Jest 模拟此动态导入的成功和失败 promise 案例,以确保分别在解决或失败时调用每个方法(
successMethod
和 errorMethod
)?我找到了
jest.doMock
有助于模拟已解决的案例,但没有找到通过模拟使动态导入失败的方法,因此 catch
案件被揭开。注:这不是一个 react 应用程序,这是一个 Vanilla JS 项目。
最佳答案
原型(prototype)方法可以在 MyClass.prototype
上进行监视或模拟。或类实例。应该为每个测试恢复模块模拟和 spy 功能,以使它们不会相互影响。
let myClass;
beforeEach(() => {
jest.resetModules();
jest.restoreAllMocks();
myClass = new MyClass();
jest.spyOn(myClass, 'successMethod');
jest.spyOn(myClass, 'errorMethod');
});
jest.doMock
调用后需要导入所有受影响的模块。为了动态import
导致被拒绝的 promise ,myFile
模块在评估时应该抛出错误。由于动态import
返回一个 promise ,测试应该是异步的。it('...', async () => {
jest.mock('./myFile.js', () => 'value');
await expect(myClass.myMethod()).resolves.toEqual(/* return value from successMethod */);
expect(myClass.successMethod).toBeCalled();
expect(myClass.errorMethod).not.toBeCalled();
});
it('...', async () => {
jest.mock('./myFile.js', () => { throw new Error() });
await expect(myClass.myMethod()).rejects.toThrow(/* error message from errorMethod */);
expect(myClass.successMethod).not.toBeCalled();
expect(myClass.errorMethod).toBeCalled();
});
关于javascript - 如何使用 Jest 测试动态导入(then 和 catch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63892816/