javascript - 如何使用 Jest 测试动态导入(then 和 catch)

标签 javascript jestjs dynamic-import

所以我一直在努力如何测试动态导入,在这种情况下,尤其是开 Jest ,我在互联网上阅读了很多,但没有找到任何具体的东西,所以我想提出这个问题来集中一个体面的解决方案.
我在一个类中有以下方法

class MyClass {
   successMethod() {  ...  }

   errorMethod() { ... }

    myMethod() {
        return import('./myFile.js')
           .then(() => this.successMethod())
           .catch(() => this.errorMethod());
    }
}
我的问题是:
您如何使用 Jest 模拟此动态导入的成功和失败 promise 案例,以确保分别在解决或失败时调用每个方法( successMethoderrorMethod )?
我找到了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/

相关文章:

javascript - 替换 URL 中 id 的值

javascript - 如何检测IE6,并显示警报?

javascript - 与 Bootstrap 下拉菜单链接时如何使用 Javascript if 语句

javascript - react CKeditor Jest 错误 : SyntaxError: Cannot use import statement outside a module

javascript - 在 Jest 中测试嵌套的 promise

javascript - 使用 xhr-mock 测试 AJAX 函数失败

python - 从字符串动态导入文件中的方法

javascript - 如何在React中创建和删除组件?

next.js - 动态导入未知组件-NextJs

python - 如何动态导入模块?