Mejor manera de deshabilitar la consola dentro de las pruebas unitarias

7 minutos de lectura

Avatar de usuario de Apidcloud
Apidcloud

Me pregunto si hay una mejor manera de deshabilitar los errores de la consola dentro de un específico Prueba de broma (es decir, restaurar la consola original antes/después de cada prueba).

Aquí está mi enfoque actual:

describe("Some description", () => {
  let consoleSpy;

  beforeEach(() => {
    if (typeof consoleSpy === "function") {
      consoleSpy.mockRestore();
    }
  });

  test("Some test that should not output errors to jest console", () => {
    expect.assertions(2);

    consoleSpy = jest.spyOn(console, "error").mockImplementation();
 
    // some function that uses console error
    expect(someFunction).toBe("X");
    expect(consoleSpy).toHaveBeenCalled();
  });

  test("Test that has console available", () => {
    // shows up during jest watch test, just as intended
    console.error("test");
  });
});

¿Hay una forma más limpia de lograr lo mismo? me gustaría evitar spyOnpero mockRestore solo parece funcionar con eso.

  • Accidentalmente terminé ocultando un error real al hacer esto. Idealmente, lo primero que debe intentar hacer es diagnosticar una advertencia o un error. Si es realmente benigno, hay muchas respuestas a continuación para ayudar a ocultarlo.

    – Devin Rhode

    6 de septiembre de 2021 a las 3:22

  • @DevinRhode, es un consejo decente Pero hay casos en los que se espera la salida de la consola como parte de una prueba, por ejemplo, probar el código de manejo de errores en una función. Y, a veces, es posible que desee llamar al código de terceros que registra la consola, en lugar de burlarse de él.

    – Erik Hermansen

    8 ene a las 23:02

Avatar de usuario de Raja Jaganathan
Raja Jaganatán

Para un archivo de especificaciones en particular, el de Andreas es lo suficientemente bueno. La configuración a continuación suprimirá console.log declaraciones para todos los conjuntos de pruebas,

jest --silent

(o)

Personalizar warn, info and debug puede usar la configuración a continuación

pruebas/setup.js o jest-preload.js configurado en setupFilesAfterEnv

global.console = {
  ...console,
  // uncomment to ignore a specific log level
  log: jest.fn(),
  debug: jest.fn(),
  info: jest.fn(),
  // warn: jest.fn(),
  // error: jest.fn(),
};

jest.config.js

module.exports = {
    verbose: true,
    setupFilesAfterEnv: ["<rootDir>/__tests__/setup.js"],
};

  • ¡Hola! setupTestFrameworkScriptFile está en desuso en favor de setupFilesAfterEnv.

    – elhoucine

    25 de enero de 2019 a las 17:02


  • Burlón global.console es de hecho una forma sencilla de hacerlo, y se puede hacer a través de cualquier configurado setupFilesAfterEnv . Cuidado con burlarse de todos los métodos nativos del console objeto o puede encontrar otros errores inesperados.

    – Solicitud de vado

    6 de agosto de 2019 a las 14:17

  • Tenga en cuenta que si luego desea verificar el simulacro (o borrarlo), deberá referirse a él como console.log, por ejemplo, expect(console.log).toBeCalledTimes(1).

    – Pedro Gerdes

    22 de junio de 2021 a las 13:59

  • También puede agregar el "silent": true opción a la jest.config.js expediente

    – Delicadeza

    29 de noviembre de 2021 a las 7:53

Avatar de usuario de Constantin
Constantino

Si quieres hacerlo solo para una prueba específica:

beforeEach(() => {
  jest.spyOn(console, 'warn').mockImplementation(() => {});
});

  • No funciona en mis pruebas, todavía tengo algunos console.warn durante la prueba. Probado varias veces, no es a prueba de balas.

    – Dimitri Kopriwa

    15 de marzo de 2021 a las 12:06


  • No sé por qué esta respuesta tiene tantos votos a favor. Es una excelente manera de deshabilitar la funcionalidad de la consola antes de cada prueba (como el nombre beforeEach implicaría), pero no responde la pregunta del OP, que es “cómo deshabilitar los errores de la consola dentro de un específico Prueba de broma”.

    – fenix.sombra

    15/09/2021 a las 18:25

  • @fenix.shadow es muy fácil de adaptar para hacerlo dentro de una sola prueba. Cualquier cosa que se pueda hacer dentro de un beforeEach se puede hacer dentro de un it. En cuanto a la gente que dice que no funciona… a mí sí. Es posible que también desee detectar el error generado por el controlador de errores predeterminado de Vue Test Utils.

    – Ariane

    7 oct 2021 a las 15:46

  • La parte que falta de adaptarlo para que se use en una sola prueba es llamar consoleSpy.mockRestore() después. El código proporcionado en esta solución dejará el registro de la consola deshabilitado para todas las pruebas en el archivo JS que se ejecutan después, lo que puede ocultar errores. El ejemplo de código original del OP soluciona esto.

    – Erik Hermansen

    8 ene a las 23:07


  • Los espías están aislados por prueba

    – Constantino

    10 de enero a las 16:16

Como cada archivo de prueba se ejecuta en su propio subproceso, no es necesario restaurarlo si desea deshabilitarlo para todas las pruebas en un solo archivo. Por la misma razón, también puedes simplemente escribir

console.log = jest.fn()
expect(console.log).toHaveBeenCalled();

  • Gracias por la información sobre ese asunto. Tiene sentido 🙂 Estaba buscando una manera de hacerlo de esa manera solo dentro de una prueba específica sin tener que restaurarla (inicialmente pensé que ese era el comportamiento predeterminado), pero supongo que beforeEach hace el truco.

    – Apidcloud

    12 de junio de 2017 a las 11:01

  • Pero las próximas pruebas en el mismo archivo seguirán burlándose, ¿verdad? Dependiendo de la situación, eso puede no ser ideal.

    – Ariane

    7 oct 2021 a las 15:47

Encontré que la respuesta anterior re: suprimir console.log en todos los conjuntos de pruebas arrojaron errores cuando cualquier otro console métodos (ej. warn, error) fueron llamados ya que estaba reemplazando todo el global console objeto.

Este enfoque algo similar funcionó para mí con Jest 22+:

paquete.json

"jest": {
  "setupFiles": [...],
  "setupTestFrameworkScriptFile": "<rootDir>/jest/setup.js",
  ...
}

broma/setup.js

jest.spyOn(global.console, 'log').mockImplementation(() => jest.fn());

Utilizando este método, sólo console.log es burlado y otros console los métodos no se ven afectados.

Para mí, una forma más clara/limpia (el lector necesita poco conocimiento de la API de jest para comprender lo que está sucediendo), es simplemente hacer manualmente lo que hace mockRestore:

// at start of test you want to suppress
const consoleLog = console.log;
console.log = jest.fn();

// at end of test
console.log = consoleLog;

  • También debe cubrir console.info, console.error, console.warn, etc.

    – Michael Oril

    24/10/2019 a las 15:00

  • @ michael-liquori, ¿por qué necesita reiniciar console.log? Creo que después de cada descripción se borran los simulacros.

    – Jhonatán

    9 de julio de 2020 a las 14:03

  • @Jhonatan No creo que quede claro después de cada descripción, aunque no lo he probado recientemente para estar seguro. De acuerdo a documentos de broma hay un clearMocks y resetMocks opción de configuración pero ambos por defecto false, y ninguno de ellos realmente restaura la implementación inicial, incluso si se establece en true. Y, considerando que esta es una opción de configuración que podría cambiarse en algún momento, creo que es una buena práctica limpiar manualmente para garantizar que sus pruebas no causen problemas en el futuro.

    – Michael licores

    9 de julio de 2020 a las 20:23

Avatar de usuario de Dmitry Grinko
Dmitri Grinko

beforeAll(() => {
    jest.spyOn(console, 'log').mockImplementation(() => {});
    jest.spyOn(console, 'error').mockImplementation(() => {});
    jest.spyOn(console, 'warn').mockImplementation(() => {});
    jest.spyOn(console, 'info').mockImplementation(() => {});
    jest.spyOn(console, 'debug').mockImplementation(() => {});
});

  • También debe cubrir console.info, console.error, console.warn, etc.

    – Michael Oril

    24/10/2019 a las 15:00

  • @ michael-liquori, ¿por qué necesita reiniciar console.log? Creo que después de cada descripción se borran los simulacros.

    – Jhonatán

    9 de julio de 2020 a las 14:03

  • @Jhonatan No creo que quede claro después de cada descripción, aunque no lo he probado recientemente para estar seguro. De acuerdo a documentos de broma hay un clearMocks y resetMocks opción de configuración pero ambos por defecto false, y ninguno de ellos realmente restaura la implementación inicial, incluso si se establece en true. Y, considerando que esta es una opción de configuración que podría cambiarse en algún momento, creo que es una buena práctica limpiar manualmente para garantizar que sus pruebas no causen problemas en el futuro.

    – Michael licores

    9 de julio de 2020 a las 20:23

Avatar de usuario de Dr-Bracket
Dr-soporte

Aquí están todas las líneas que puede querer usar. Puedes ponerlos en la prueba:

jest.spyOn(console, 'warn').mockImplementation(() => {});
console.warn("You won't see me!")
expect(console.warn).toHaveBeenCalled();
console.warn.mockRestore();

¿Ha sido útil esta solución?