String.prototype.replaceAll()
是一种有用的方法,在构建和执行时一切正常。但是,所有 Jest 测试都失败并出现以下错误:
TypeError: replaceAll is not a function
这些是我的依赖项:
"dependencies": {
"core-js": "^3.6.5",
"vue": "^2.6.11",
"vue-class-component": "^7.2.3",
"vue-i18n": "^8.22.0",
"vue-property-decorator": "^8.4.2",
"vue-router": "^3.3.4",
"vuex": "^3.5.1"
},
"devDependencies": {
"@vue/test-utils": "^1.1.0",
"jest-junit": "^12.0.0",
"ts-jest": "^26.4.1",
"typescript": "~3.9.3",
"vue-jest": "^3.0.7",
"vue-template-compiler": "^2.6.10"
},
我该如何解决这个问题?
原文由 leonheess 发布,翻译遵循 CC BY-SA 4.0 许可协议
问题
发生这种情况是因为
replaceAll
是一个新功能,并未在所有浏览器或较旧的 Node.js 版本(早于 15.0)中实现,如其他答案中所述。您可以在 我可以使用 中查看哪些浏览器支持它:但是,不是将
.replace
与 RegExp 一起使用,您可以添加一个 polyfill 来支持旧浏览器(如果需要)。就我而言,我使用的是 Electron,所以我只需要为 Jest 做这件事。垫片可以 在这里找到。
解决方案
用作浏览器的 polyfill
作为依赖项安装
npm i string.prototype.replaceall
或yarn add string.prototype.replaceall
;在您的项目中添加以下代码。它只需要在一个地方添加。
仅在 Jest 中使用
更新 Node.js
正如@leonheess 在评论中提到的,您可以将 Node.js 更新到更新的版本。您需要一个使用 V8 中的 8.5 版本的 版本,该版本是
.replaceAll
实现的时候。根据 Node.js 网站上可用的列表,两个版本都没有使用 V8 8.5,但是从 Node.js 15.0.0 开始,使用的是 V8 的 8.6 版本。因此,升级到 Node.js v15 或更高版本。
用作 polyfill
如果你只想为 Jest 解决这个问题,你可以按照 这个问题中 提到的去做:
使用
npm i -D string.prototype.replaceall
或yarn add -D string.prototype.replaceall
作为开发依赖安装;修改你的 Jest 配置,添加一个
setupFilesAfterEnv
属性如下:jestSetup
文件中: