Crear una prueba de broma como:
test("btoa", () => { expect(btoa("aaa")).toStrictEqual("YWFh"); });falla con
ReferenceError: btoa is not defined sin embargo, node define btoa a partir del nodo 16, y así lo siguiente:
console.log(bota("aaa")) emite correctamente YWFh .
¿Cómo puedo configurar jest para que pase esta prueba? Claramente, algo está sucediendo en el corredor de prueba de broma para que no se ejecute en el entorno de nodo actual, o de lo contrario está eliminando elementos integrados específicos, solo que parece que no puedo encontrar ninguna documentación sobre cómo depurar o ajustar esto.
Hay soluciones al escribir la codificación manualmente en "js puro" o dependiendo de algo que sea similar, pero estoy particularmente interesado en por qué el final de la ejecución de broma no encuentra elementos integrados que parecen estar presentes en otros entornos.
Esto también funciona bien en otros marcos de prueba como mocha, por lo que está claramente relacionado con el corredor de bromas en particular.
Después de mucho buscar y rascarme la cabeza en cuanto a por qué btoa/atob están disponibles en el nodo pero NO están disponibles en broma ejecutándose en el nodo, finalmente lo descubrí. Jest ejecuta todas las pruebas dentro de una vm , que es un entorno aislado de espacio aislado. Los métodos btoa/atob no se exponen automáticamente en el objeto global dentro de una máquina virtual. Mejor explicado con un ejemplo:
const vm = require('vm'); // this works outside the vm - but for legacy reasons only // you shouldn't be doing this in the first place btoa('aaa'); // -> "YWFh" const context = vm.createContext({}); const code = 'btoa("aaa")'; vm.runInContext(code, context); //-> Uncaught ReferenceError: btoa is not definedNota: La respuesta que se describe a continuación sigue siendo la "solución": debe definir estos métodos para usarlos en el nodo y, luego, debe exponerlos mediante el
globalSetupde jest.
La raíz de su problema es el hecho de que NodeJS y los navegadores web tienen diferentes API. Por ejemplo, recibo este aviso de desaprobación cuando trato de usar btoa en mi aplicación de nodo.
La primera parte de la solución es que debe proporcionar sus propios métodos atob / btoa para usar en NodeJs (consulte los ejemplos aquí ). Luego, debe hacer que estén disponibles utilizando la configuración globalSetup de jest:
/** Encodes a string as base64 format */ global.btoa = (str: string) => Buffer.from(str, 'binary').toString('base64'); /** Decodes a base64 encoded string */ global.atob = (str: string) => Buffer.from(str, 'base64').toString('binary');Si no se siente cómodo haciéndolo usted mismo, existen bibliotecas y herramientas que lo hacen por usted (jsdom, phantomjs, testing-library). Estas bibliotecas esencialmente replican las API del navegador en un entorno de nodo para hacer cosas como ejecutar pruebas, renderizado del lado del servidor, etc. Recomiendo leer sobre pruebas de marcos web para ejemplos de código y técnicas.