String.prototype.replaceAll() es un método útil y mientras construye y ejecuta todo funciona bien. Sin embargo, todas las pruebas Jest fallan con el siguiente error:
TypeError: replaceAll is not a functionEstas son mis dependencias:
"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" },¿Cómo puedo solucionar este comportamiento?
Esto sucede porque replaceAll es una función nueva que no está implementada en todos los navegadores ni en las versiones anteriores de Node.js, como se menciona en la otra respuesta. Puede ver qué navegadores lo admiten en Can I Use :
Pero, en lugar de usar .replace con RegExp, puede agregar un polyfill para admitir navegadores más antiguos (si es necesario). En mi caso, estoy usando Electron, así que necesito hacerlo solo para Jest.
La cuña se puede encontrar aquí .
Instale como una dependencia con npm i string.prototype.replaceall o yarn add string.prototype.replaceall ;
Agregue el siguiente código en su proyecto. Debe agregarse en un solo lugar.
import replaceAllInserter from 'string.prototype.replaceall'; replaceAllInserter.shim(); Como @leonheess mencionó en los comentarios, puede actualizar Node.js a una versión más reciente. Necesitará una versión que use la versión 8.5 de V8 , que es cuando se implementó .replaceAll .
Según la lista disponible en el sitio web de Node.js , ninguna de las versiones usa V8 8.5, pero a partir de Node.js 15.0.0, se usa la versión 8.6 de V8. Entonces, actualice a Node.js v15 o superior.
Si desea solucionar este problema solo para Jest, puede hacer lo que se menciona en este problema :
Instale como una dependencia de desarrollo con npm i -D string.prototype.replaceall o yarn add -D string.prototype.replaceall ;
Modifique su configuración de Jest, agregue una propiedad setupFilesAfterEnv como se muestra a continuación:
{ "jest": { "setupFilesAfterEnv": ["<rootDir>/jestSetup.js"] } }jestSetup : import replaceAllInserter from 'string.prototype.replaceall'; replaceAllInserter.shim();Lo más probable es que esto suceda porque String.prototype.replaceAll no está implementado en Node.js (al menos a partir de la versión v14.15.0 ).
Una alternativa que podría usar son expresiones regulares como en este ejemplo:
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'Puede consultar aquí para obtener más información sobre las expresiones regulares.