Je me demande s’il existe un meilleur moyen de désactiver les erreurs de console inside a 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 un moyen plus propre de réaliser la même chose? Je voudrais éviter spyOn
, mais mockRestore
semble seulement fonctionner avec cela .
Merci!
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 d'un fichier. Pour la même raison, vous pouvez aussi simplement écrire
console.log = jest.fn()
expect(console.log).toHaveBeenCalled();
Andreas est suffisant pour les fichiers de spécifications. La configuration ci-dessous supprimera les instructions console.log
pour toutes les suites de tests,
jest --silent
(ou)
Pour personnaliser warn, info and debug
, vous pouvez utiliser la configuration ci-dessous
__tests __/setup.js
global.console = {
log: jest.fn()
}
jest.config.js
module.exports = {
verbose: true,
setupTestFrameworkScriptFile: "<rootDir>/__tests__/setup.js",
};
J'ai trouvé que la réponse ci-dessus concernant la suppression de console.log
dans toutes les suites de tests générait des erreurs lorsque d'autres méthodes console
(par exemple, warn
, error
) étaient appelées, car elles remplaçaient l'objet global console
complet.
Cette approche un peu similaire a fonctionné pour moi avec Jest 22+:
"jest": {
"setupFiles": [...],
"setupTestFrameworkScriptFile": "<rootDir>/jest/setup.js",
...
}
jest.spyOn(global.console, 'log').mockImplementation(() => jest.fn());
Avec cette méthode, seul console.log
est simulé et les autres méthodes console
ne sont pas affectées.
Une autre approche consiste à utiliser process.env.NODE_ENV
. De cette façon, on peut choisir de manière sélective ce qu'il faut afficher (ou non) lors de l'exécution de 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 initiale, mais donne le résultat attendu tant que l’on a la possibilité d’envelopper le console.log
avec la condition mentionnée.