【问题标题】:Jest not mocking module when using "doMock" to avoid hoisting使用“doMock”以避免提升时开玩笑不模拟模块
【发布时间】:2019-04-03 15:56:05
【问题描述】:

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

const mockMethod = jest.fn();

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

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

由于吊装,mockClassA 在 jest 模拟 `../src/ClassB" 时未定义。

我已经读过,如果您不想提升,只需使用 doMock 代替:

使用 babel-jest 时,对 mock 的调用将自动提升到代码块的顶部。如果您想明确避免这种行为,请使用此方法。

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
      })
    }
  };
});

【问题讨论】:

    标签: javascript unit-testing jestjs


    【解决方案1】:

    我认为你有两个选择:

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

    【讨论】:

    • 1 的问题是我得到了模拟方法的不同实例,因为它们是函数。无法使选项 2 起作用,您有示例吗? require('../src/ClassB') 似乎没有影响。
    猜你喜欢
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 2018-09-14
    • 2021-04-28
    • 2019-10-18
    相关资源
    最近更新 更多