Jest:TypeError: replaceAll is not a function,怎么解决这个错误?

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 许可协议
阅读 3.6k
2 个回答

问题

发生这种情况是因为 replaceAll 是一个新功能,并未在所有浏览器或较旧的 Node.js 版本(早于 15.0)中实现,如其他答案中所述。您可以在 我可以使用 中查看哪些浏览器支持它:

在此处输入图像描述

但是,不是将 .replace 与 RegExp 一起使用,您可以添加一个 polyfill 来支持旧浏览器(如果需要)。就我而言,我使用的是 Electron,所以我只需要为 Jest 做这件事。

垫片可以 在这里找到

解决方案

用作浏览器的 polyfill

  1. 作为依赖项安装 npm i string.prototype.replaceallyarn add string.prototype.replaceall

  2. 在您的项目中添加以下代码。它只需要在一个地方添加。

 import replaceAllInserter from 'string.prototype.replaceall';

replaceAllInserter.shim();

仅在 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 解决这个问题,你可以按照 这个问题中 提到的去做:

  1. 使用 npm i -D string.prototype.replaceallyarn add -D string.prototype.replaceall 作为开发依赖安装;

  2. 修改你的 Jest 配置,添加一个 setupFilesAfterEnv 属性如下:

 {
  "jest": {
    "setupFilesAfterEnv": ["<rootDir>/jestSetup.js"]
  }
}

  1. 将以下代码添加到您的 jestSetup 文件中:
 import replaceAllInserter from 'string.prototype.replaceall';

replaceAllInserter.shim();

原文由 Rafael Tavares 发布,翻译遵循 CC BY-SA 4.0 许可协议

这很可能发生,因为 String.prototype.replaceAll 没有在 Node.js 中实现(至少从版本 v14.15.0 )。

您可以使用的一种替代方法是正则表达式,如本例所示:

 const str = 'foo-foo';
const regex = /foo/g; // Note the 'g' flag, which matches all occurrences of the expression

console.log(str.replace(regex, 'bar')); // 'bar-bar'

您可以 在此处 查看有关正则表达式的更多信息。

原文由 ElCholoGamer 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题