【发布时间】: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