Je me demande s'il existe une meilleure façon de désactiver les erreurs de console dans un test Jest spécifique (c'est-à-dire restaurer la console d'origine avant / après chaque test).
Voici mon approche actuelle:
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-t-il une manière plus propre d'accomplir la même chose? Je voudrais éviter spyOn
, mais mockRestore
semble seulement travailler avec .
Merci!
la source
setupTestFrameworkScriptFile
est obsolète au profit desetupFilesAfterEnv
.global.console
est en effet un moyen simple de procéder et peut être effectuée via n'importe quelle configurationsetupFilesAfterEnv
. Faites attention de vous moquer de toutes les méthodes natives de l'console
objet ou vous risquez de rencontrer d'autres erreurs inattendues.Comme chaque fichier de test s'exécute dans son propre thread, il n'est pas nécessaire de le restaurer si vous souhaitez le désactiver pour tous les tests dans un fichier. Pour la même raison, vous pouvez aussi simplement écrire
console.log = jest.fn() expect(console.log).toHaveBeenCalled();
la source
Si vous voulez le faire juste pour un test spécifique:
beforeEach(() => { jest.spyOn(console, 'warn').mockImplementation(() => {}); });
la source
Je trouve que la réponse ci - dessus re: suppression
console.log
dans toutes les suites de test a jeté des erreurs lors d'autresconsole
méthodes (par exemplewarn
,error
) ont été appelés depuis qu'il remplaçait l'ensemble globalconsole
objet.Cette approche quelque peu similaire a fonctionné pour moi avec Jest 22+:
package.json
"jest": { "setupFiles": [...], "setupTestFrameworkScriptFile": "<rootDir>/jest/setup.js", ... }
plaisanterie / setup.js
jest.spyOn(global.console, 'log').mockImplementation(() => jest.fn());
En utilisant cette méthode, seule
console.log
est simulée et les autresconsole
méthodes ne sont pas affectées.la source
Pour moi, une manière plus claire / propre (le lecteur a besoin de peu de connaissances de l'API jest pour comprendre ce qui se passe), consiste simplement à faire manuellement ce que fait mockRestore:
// at start of test you want to suppress const consoleLog = console.log; console.log = jest.fn(); // at end of test console.log = consoleLog;
la source
clearMocks
etresetMocks
, mais elles sont toutes les deux par défautfalse
, et aucune de celles-ci ne rétablit réellement l'implémentation initiale même si elle est définie surtrue
. Et, étant donné qu'il s'agit d'une option de configuration qui pourrait être modifiée à un moment donné, je pense qu'il est préférable de nettoyer manuellement pour s'assurer que vos tests ne poseront pas de problèmes à l'avenir.Une autre approche consiste à utiliser
process.env.NODE_ENV
. De cette façon, on peut choisir sélectivement ce qu'il faut afficher (ou non) lors de l'exécution des tests: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'); }
ou
const logDev = msg => { if (process.env.NODE_ENV === 'development') { console.log(msg); } } logDev('Show output only while in "development" mode');
Cela nécessitera que cette configuration soit placée sur
package.json
:"jest": { "globals": { "NODE_ENV": "test" } }
Notez que cette approche n'est pas une solution directe à la question d'origine, mais donne le résultat attendu tant que l'on a la possibilité de l'envelopper
console.log
avec la condition mentionnée.la source
===
par!==
selon vos besoins. J'utilise cette approche depuis des années et cela fonctionne parfaitement, mais je fais des ajustements en fonction de mes besoins.