la prueba unitaria genera un error debido a que .getContext() no está implementado

3 minutos de lectura

avatar de usuario de lpie88
lpie88

Estoy escribiendo pruebas usando Jest para componentes que usan elementos de lienzo. Sigo recibiendo un error cuando ejecuto mis pruebas que se ve así.

Error: Not implemented: HTMLCanvasElement.prototype.getContext (without installing the canvas npm package)

Según tengo entendido, Jest usa jsdom para sus pruebas y ese jsdom es compatible con canvas si instala los paquetes canvas o canvas preconstruidos.

He intentado instalar cada uno de estos paquetes y ninguno de ellos ha resuelto el error. Lo único que creo que podría estar saliendo mal es que jsdom no puede encontrar los paquetes canvas o canvas preconstruidos. ¿Alguien sabe una forma de corregir este error o probar para ver si jsdom está encontrando los otros paquetes? ¡Muchas gracias!

Mi equipo está usando create-react-app y anteriormente habíamos abordado este problema agregando el paquete npm jest-canvas-mock. Ahora, después de actualizar a react-scripts 3.4.1, también tuvimos que agregar una importación específica a nuestro src/setupTests.ts archivo:

import 'jest-canvas-mock';

Puede crear su propia simulación de la función en un script de configuración de broma

HTMLCanvasElement.prototype.getContext = () => { 
  // return whatever getContext has to return
};

  • Esto funcionó perfectamente. Intenté hacer algo similar a esto, pero resulta que no incluí la ruta al archivo en mi matriz setupFiles. ¡Muchas gracias por tu ayuda!

    – lpie88

    18 de febrero de 2018 a las 14:06

  • Agregue esta configuración a su setupFile.js

    – nima

    12 de julio de 2019 a las 8:10

  • Esto dejó de funcionar para mí con Jest 27 (“ReferenceError: HTMLCanvasElement no está definido”). Editar: agregando testEnvironment: "jsdom", a jest.config.js lo arregló. Este fue un cambio predeterminado en Jest 27: jestjs.io/blog/2021/05/25/jest-27

    – forresto

    12 de agosto de 2021 a las 8:03


  • También puede agregar esto en archivos de prueba individuales.

    – DarkTrick

    6 de diciembre de 2022 a las 7:43

Tuve un problema similar con mis pruebas de Jest y lo resolví instalando broma-lienzo-simulacro.

  • Hay algunas preguntas sobre Stack Overflow que se responden con “simplemente instale jest-canvas-mock y aquí se explica cómo hacer ‘setupFiles'”. Sería muy útil si esas respuestas incluyeran una prueba de ejemplo completa… solo una prueba trivial estaría bien, pero mostrando cómo Se utiliza jest-canvas-mock.

    –Andy Preston

    9 de noviembre de 2020 a las 12:25

  • Sigo encontrando el mismo problema incluso después de instalar jest-canvas-mock e importarlo en el archivo de prueba. Estoy usando crear-reaccionar-aplicación

    – ionescho

    2 de agosto de 2022 a las 13:57

Lo he solucionado instalando broma-lienzo-simulacro

npm i --save-dev jest-canvas-mock

Y agregando esta configuración en package.json

{
  "jest": {
    "setupFiles": [
      "jest-canvas-mock"
    ],
  }
}

Ambas respuestas anteriores funcionan. Sin embargo, solo quería agregar que en el caso de crear-reaccionar-aplicación, no admite los ‘archivos de configuración’ requeridos por jest conf en package.json para jest-canvas-mock.

Lo solucioné agregando la declaración de importación en cada uno de los archivos de prueba que invocaban el elemento canvas (en mi caso, 3). Luego, moví la declaración de importación al archivo setupTests.js y también eliminé ese requisito.

  • También estoy usando create-react-app y no quería expulsar. yo importé import 'jest-canvas-mock' solo en mi setupTest.js, y hasta ahora parece funcionar.

    – Jeff

    20 mayo 2020 a las 20:05


avatar de usuario de wes
nosotros

puede crearlo como simulacro y no instalar un nuevo paquete:

HTMLCanvasElement.prototype.getContext = jest.fn();

  • También estoy usando create-react-app y no quería expulsar. yo importé import 'jest-canvas-mock' solo en mi setupTest.js, y hasta ahora parece funcionar.

    – Jeff

    20 mayo 2020 a las 20:05


avatar de usuario de sgtbrunner
sargentocorredor

Experimenté el mismo problema usando react-scripts 3.0.1 y lo resolvió instalando jest-canvas-mock como un dev dependencia e importarla (import 'jest-canvas-mock') en mi archivo app.test.js (de donde obtuve ese error) solo como importándolo en setupTests.js importaría innecesariamente el paquete en cada archivo de prueba.

¿Ha sido útil esta solución?