node.js - 反应测试:“TypeError:MutationObserver 不是构造函数”
问题描述
问题
我正在尝试测试一个新版本的内部组件库,它最近升级了一些依赖项,现在在内部使用 Jest 26。该库还导出了一些测试助手。
在另一个使用上述组件库的代码库中,我在运行某些单元测试时得到以下信息:
TypeError: MutationObserver is not a constructor
at /<path_to_repo>/node_modules/@testing-library/dom/dist/wait-for.js:78:18
这可能与组件库导出的测试助手依赖于 Jest 26 的事实有关,也可能无关。(很难判断这些助手是否正在使用——我们有一些非常大的“单元”测试。)
相关包版本(在消费代码库中):
- 反应脚本 3.4.4
- 开玩笑 24.9.0
- 测试库/dom 7.26.3
- 测试库/jest-dom 5.10.0
- 测试库/反应 ^10.0.0
运行yarn list jsdom
产生以下结果:
├─ jest-environment-jsdom-fourteen@1.0.1
│ └─ jsdom@14.1.0
├─ jest-environment-jsdom@24.9.0
│ └─ jsdom@11.12.0
└─ jsdom@16.4.0
我知道升级react-scripts
和 Jest 可能会解决此问题,但我正在尝试找到一种不涉及该问题的方法。(理想情况下,我们不希望这是升级到新组件库版本的先决条件。)
尝试的解决方案
强制更新jsdom
首先我尝试添加
"resolutions": {
"jsdom": "^14.0.0"
},
到我的package.json
. 这确实yarn list jsdom
只产生了输出jsdom@14.1.0
,但我仍然得到了相同的结果TypeError
。解决^15.0.0
导致相同的错误,并解决^16.0.0
给我以下错误:
TypeError: this.dom.runVMScript is not a function
at JSDOMEnvironment.runScript (node_modules/jest-environment-jsdom/build/index.js:187:23)
使用jest-environment-jsdom-*
我尝试通过安装来关注这个线程jest-environment-jsom-sixteen
。更改我的test
脚本package.json
并运行yarn test --showConfig
会产生一堆信息,包括以下行:
"testEnvironment": "/<path_to_repo>/node_modules/jest-environment-jsdom-sixteen/lib/index.js",
如果我在console.log(navigator.userAgent)
测试中添加一个,我也会得到
Mozilla/5.0 (darwin) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/16.4.0
但是,我仍然得到相同的结果TypeError: MutationObserver is not a constructor
。
我也试过jest-environment-jsdom-fourteen
and jest-environment-jsdom-fifteen
,并在强迫jsdom
to 的同时尝试^14.0.0
。结果相同。
使用mutationobserver-shim
我在我的(这是我的 Jest 配置指向的内容)中运行yarn add -D mutationobserver-shim
并导入它(使用) ,但这导致了以下错误:import 'mutationobserver-shim'
jestSetup.ts
globalSetup
ReferenceError: window is not defined
at Object.<anonymous> (/<path_to_repo>/node_modules/mutationobserver-shim/dist/mutationobserver.min.js:12:1)
将导入添加到我的测试文件中产生了与TypeError
上面相同的结果,并将 a 添加console.log(global.MutationObserver)
到我的测试文件中产生了undefined
.
一个不太好的解决方案
经过大量的试验和错误,我发现如果我 1) 已经jest-environment-jsdom-sixteen
安装并告诉 Jest 使用它,并且 2) 添加import 'mutationobserver-shim'
我的测试文件,测试就会通过。但是,如果我将导入添加到我的 JestglobalSetup
文件中,它就不起作用。我得到ReferenceError: window is not defined
和以前一样的错误。
我的问题
如何在不要求我们组件库的用户向所有测试文件添加导入语句的情况下摆脱这两个错误?
解决方案
应该应用 polyfill,setupFilesAfterEnv
因为这是 JSDOM 环境被实例化并window
变得可用的地方。window
不应该可用,globalSetup
因为它不在测试范围内运行。
如果这是未弹出的 create-react-app 项目,则对应的设置文件setupFilesAfterEnv
是src/setupTests.ts
( src/setupTests.js
)。
较新jsdom
的版本会导致错误,这意味着它与旧的 Jest ( jest@24
) 不兼容。它们应该被弹出和升级,或者react-scripts@4
必须使用支持 Jest 26 的更新的 CRA ( )。
推荐阅读
- xamarin - Xamarin 表单,myDir.Mkdir(); 在 Android 项目中返回 false
- c# - 在 LINQ 查询中选择后排序
- jupyter-notebook - 如果存在小部件,则 Jupyter 错误“笔记本验证失败”(清除所有输出有帮助,但问题再次出现)
- c++ - 创建一个段树,但它仍然为空。我找不到错误?
- json - org.codehaus.jackson.JsonParseException: 意外字符 ('d' (code 100)): 期望用逗号分隔 OBJECT 条目\n
- python - 如何在 Scrapy 中解析动态参数
- python - Jupyter 环境错误,加载的 tensorflow 版本与安装的不同
- rest - 使用 sipgate Rest API 发布语音邮件问候语
- python - 如何在特定时间之间获取记录?
- flutter - 减小 NavigationRailDestination Tiles 的大小