javascript - 使用“doMock”以避免提升时开玩笑不模拟模块
问题描述
我正在尝试模拟一个创建并返回另一个类的类。我有这个:
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
})
}
};
});
解决方案
我认为您在这里有两个选择:
- 使用
jest.mock
,内联mockClassA
和mockMethod
,在模拟中公开它们,然后从'../src/ClassB'导入 require
使用 doMock,但在测试用例中使用动态。
推荐阅读
- android - 将数据插入本地数据库时,Android ProgressBar 不更新
- google-analytics - 谷歌分析:“?__c = 1”指的是什么?
- python - 如何快速验证 CNN 是否真正学习?
- c# - 通过在 C# 中解析 JSON 文件来替换 word 文档中的字符串
- kubernetes - Kubernate:无法在其他节点上 ping pod ip
- html - Bootstrap 在较小的设备上显示模态内容
- asp.net-mvc - 将应用程序发布到 Azure 网站后出现问题
- shell - 使用 shell 脚本在另一个文件中搜索文件的确切内容
- jquery - 在烧瓶中将服务器端生成的数据实时发送到客户端的最佳方式是什么?
- python - 删除 SQLite3 (dbBrowser) 中 id 与某个输入匹配的字段