javascript - 使用 "doMock"以避免提升时开 Jest 不模拟模块

标签 javascript unit-testing jestjs

我正在尝试模拟一个创建并返回另一个类的类。我有这个:

const mockMethod = jest.fn();

const mockClassA = jest.fn<ClassA>(() => ({
  method: mockMethod
}));

jest.mock("../src/ClassB", () => ({
  ClassB: {
    getClassA: () => new mockClassA()
  }
}));

由于提升而被捕获,当 jest 模拟 `../src/ClassB"时,mockClassA 未定义。

我读过,如果您不想提升,只需使用 doMock 即可:

When using babel-jest, calls to mock will automatically be hoisted to the top of the code block. Use this method if you want to explicitly avoid this behavior.

https://jestjs.io/docs/en/next/jest-object#jestdomockmodulename-factory-options

当我使用mock运行时,我得到TypeError:mockClassA is not a constructor,因为mockClassA未定义,因为mock被提升到上面mockClassA 的定义。

当我将 mock 更改为 doMock 时,它根本不模拟模块 - 它使用真实的东西。

<小时/>

编辑:内联声明它们意味着我无法轻松访问模拟方法进行检查:

jest.mock("../src/ClassB", () => ({
  ClassB: {
    getClassA: () => ({
      method: jest.fn()
    })
  }
}));

因为 getClassA 是一个函数,所以它使用 method 返回对象的单独实例。

<小时/>

编辑2:啊!设法像这样内联它:

jest.mock("../src/ClassB", () => {
  const mockMethod: jest.fn();
  return {
    ClassB: {
      getClassA: () => ({
        method: mockMethod
      })
    }
  };
});

最佳答案

我认为你有两个选择:

  1. 使用jest.mock,内联mockClassAmockMethod,在mock中公开它们,然后从'../src/导入B类'
  2. 使用 doMock,但在测试用例中使用动态 require

关于javascript - 使用 "doMock"以避免提升时开 Jest 不模拟模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55499409/

相关文章:

javascript - 如何使 Transcrypt 编译为对象而不是字典?

javascript - 如何在javascript中为推送通知提供音频播放文件路径?

c# - Rhinomock 期望中的非原始对象

javascript - 在自定义钩子(Hook)中测试 fetch.catch

javascript - 意外 token ,在 NodeJS Jest 测试中导入 JSON 时预期为 ";"

javascript - 围绕视频播放列表创建内容节目

javascript - 在 React 中仅显示来自 Rest api 的单个对象数组

jestjs - Jest 与 Babel ^7.0.0-beta.51 问题

java - PowerMock 有什么好的替代品吗?

python - 如何模拟嵌套函数?