Me pregunto si hay una mejor manera de deshabilitar los errores de la consola dentro de una prueba Jest específica (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");
});
});
¿Existe una forma más limpia de lograr lo mismo? Me gustaría evitarlo spyOn
, pero mockRestore
solo parece funcionar con él .
¡Gracias!
fuente
setupTestFrameworkScriptFile
está en desuso a favor desetupFilesAfterEnv
.global.console
es una forma sencilla de hacerlo y se puede realizar a través de cualquier configuraciónsetupFilesAfterEnv
. Tenga cuidado de burlarse de todos los métodos nativos delconsole
objeto o puede encontrar otros errores inesperados.Como cada archivo de prueba se ejecuta en su propio hilo, no es necesario restaurarlo si desea desactivarlo para todas las pruebas en un archivo. Por la misma razón, también puedes escribir
console.log = jest.fn() expect(console.log).toHaveBeenCalled();
fuente
Si quieres hacerlo solo para una prueba específica:
beforeEach(() => { jest.spyOn(console, 'warn').mockImplementation(() => {}); });
fuente
Descubrí que la respuesta anterior re: suprimir
console.log
en todas las suites de prueba arrojaba errores cuando se llamaba a cualquier otroconsole
método (por ejemplowarn
,error
) ya que reemplazaba todo elconsole
objeto global .Este enfoque algo similar funcionó para mí con Jest 22+:
package.json
"jest": { "setupFiles": [...], "setupTestFrameworkScriptFile": "<rootDir>/jest/setup.js", ... }
jest / setup.js
jest.spyOn(global.console, 'log').mockImplementation(() => jest.fn());
Con este método, solo
console.log
se burla y los demásconsole
métodos no se ven afectados.fuente
Para mí, una forma más clara / limpia (el lector necesita poco conocimiento de la API de broma para comprender lo que está sucediendo) es 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;
fuente
clearMocks
yresetMocks
, pero ambas están predeterminadasfalse
, y ninguna de ellas restaura la implementación inicial incluso si está configurada entrue
. 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.Otro enfoque es utilizar
process.env.NODE_ENV
. De esta manera, uno puede elegir selectivamente qué mostrar (o no) mientras se realizan las pruebas:if (process.env.NODE_ENV === 'development') { console.log('Show output only while in "development" mode'); } else if (process.env.NODE_ENV === 'test') { console.log('Show output only while in "test" mode'); }
o
const logDev = msg => { if (process.env.NODE_ENV === 'development') { console.log(msg); } } logDev('Show output only while in "development" mode');
Esto requerirá que esta configuración se coloque en
package.json
:"jest": { "globals": { "NODE_ENV": "test" } }
Tenga en cuenta que este enfoque no es una solución directa a la pregunta original, pero da el resultado esperado siempre que se tenga la posibilidad de ajustarlo
console.log
con la condición mencionada.fuente
===
con!==
de acuerdo a sus necesidades. He estado usando este enfoque durante años y funciona perfectamente, pero hago ajustes según mis necesidades.