我正在尝试模拟一个创建并返回另一个类的类。我有这个:
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
})
}
};
});
最佳答案
我认为你有两个选择:
- 使用
jest.mock
,内联mockClassA
和mockMethod
,在mock中公开它们,然后从'../src/导入B类' - 使用 doMock,但在测试用例中使用动态
require
。
关于javascript - 使用 "doMock"以避免提升时开 Jest 不模拟模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55499409/