javascript - 模拟类是从带有 jest 的包中导入的对象的属性
问题描述
我有以下情况:
- 在我的 .js 文件中,我导入包foo的默认导出
- 这个导出有两个属性Bar和Baz,它们都是 ES6 类
- 在我的 .test.js 文件中,我现在想模拟这两个类并监视它们的构造函数
.js 代码大致如下所示:
import foo from 'foo/dist/foo.min';
const { Bar, Baz } = foo;
...
const fooBar = new Bar();
在我的 .test.js 文件中,我现在像这样模拟包:
jest.mock('foo/dist/foo.min');
自动模拟按预期工作,但当然不允许我监视 Bar 和 Baz 的构造函数,这正是我想要的。
我试图在我的 .test.js 文件中简单地做到这一点:
import foo from 'foo/dist/foo.min';
jest.mock('foo/dist/foo.min');
foo.Bar = jest.fn();
foo.Baz = jest.fn();
但这似乎没有任何作用,我的假 jest.fn() 构造函数永远不会被调用。
我已在文档中阅读此页面:https ://jestjs.io/docs/en/es6-class-mocks.html但似乎假设要模拟的 ES6 类是直接从模块中导出的,并且是在项目内部而不是 npm 包中。
自动模拟对我不起作用,因为类本身不会导出。
- 我不能
mockImplementation()
在我的 foo 包上使用,因为它不是一个函数,对吧? - 我看不到手动模拟的方法,因为它是一个 npm 包。
我将不胜感激有关如何解决此问题的任何建议。
解决方案
几点注意事项:
babel-jest
提升呼叫,jest.mock
以便他们首先发生。- 创建的自动模拟
Jest
反映了模块的结构。
因此调用jest.mock('foo/dist/foo.min');
意味着Jest
将为该测试期间运行的任何代码自动模拟该模块,并且自动模拟将反映原始模块的结构。
看起来您的代码一运行就Bar
调用构造函数。
这意味着以下测试应该有效:
import foo from 'foo/dist/foo.min'; // foo is already auto-mocked...
import './code'; // import your code (which calls the Bar constructor)
jest.mock('foo/dist/foo.min'); // ...because this runs first
test('constructor was called', () => {
expect(foo.Bar).toHaveBeenCalled(); // SUCCESS
})
看起来您的测试不起作用,因为您在代码运行foo.Bar = jest.fn();
后设置(覆盖在您的代码运行时确实被调用的较早spy
版本)。
推荐阅读
- javascript - Why are my divs not moving when I'm pressing .button?
- javascript - React Router v5 accompanied with Code Splitting, and Data Prefetching with the use of Server Side Rendering
- c# - 使用asp.net从数据库中获取图像并显示在网络表单中
- c# - 绑定抽象类模型的简单方法,ASP.Net Core 5
- html - 如何调整 html 以打印 PDF
- ethereum - 处理事务时出现 VM 异常:恢复 TimedCrowdsale:未打开 --
- sql - 如何更新 BigQuery 上重复的非记录字段?
- java - 来自其他类异步的Java调用函数
- r - 将数字列转换为 R 识别的日期
- go - 如何使用“反射”在结构的结构内设置接口值