Ich frage mich, ob es eine bessere Möglichkeit gibt , Konsolenfehler innerhalb eines bestimmten Jest-Tests zu deaktivieren (dh die ursprüngliche Konsole vor / nach jedem Test wiederherzustellen ).
Hier ist mein aktueller Ansatz:
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");
});
});
Gibt es einen saubereren Weg, um dasselbe zu erreichen? Ich würde gerne vermeiden spyOn
, mockRestore
scheint aber nur damit zu arbeiten .
Vielen Dank!
quelle
setupTestFrameworkScriptFile
wird zugunsten von abgelehntsetupFilesAfterEnv
.global.console
ist in der Tat ein einfacher Weg und kann über jede konfigurierte Methode erfolgensetupFilesAfterEnv
. Achten Sie darauf, alle nativen Methoden desconsole
Objekts zu verspotten, da sonst andere unerwartete Fehler auftreten können.Da jede Testdatei in einem eigenen Thread ausgeführt wird, muss sie nicht wiederhergestellt werden, wenn Sie sie für alle Tests in einer Datei deaktivieren möchten. Aus dem gleichen Grund können Sie auch einfach schreiben
console.log = jest.fn() expect(console.log).toHaveBeenCalled();
quelle
Wenn Sie es nur für einen bestimmten Test tun möchten:
beforeEach(() => { jest.spyOn(console, 'warn').mockImplementation(() => {}); });
quelle
Ich fand , dass die Antwort oben Re: Unterdrückung der
console.log
über alle Testsuiten Fehler warf , wenn alle anderenconsole
Methoden (zBwarn
,error
) genannt wurden , da es wurde die gesamte globale ersetzenconsole
Objekt.Dieser etwas ähnliche Ansatz hat bei mir mit Jest 22+ funktioniert:
package.json
"jest": { "setupFiles": [...], "setupTestFrameworkScriptFile": "<rootDir>/jest/setup.js", ... }
jest / setup.js
jest.spyOn(global.console, 'log').mockImplementation(() => jest.fn());
Bei Verwendung dieser Methode wird nur
console.log
verspottet und andereconsole
Methoden bleiben davon unberührt.quelle
Für mich ist ein klarer / sauberer Weg (der Leser benötigt wenig Wissen über die Scherz-API, um zu verstehen, was passiert), einfach manuell das zu tun, was mockRestore tut:
// at start of test you want to suppress const consoleLog = console.log; console.log = jest.fn(); // at end of test console.log = consoleLog;
quelle
clearMocks
undresetMocks
Konfigurationsoption, aber beide sind standardmäßig aktiviertfalse
, und keiner von beiden stellt die ursprüngliche Implementierung tatsächlich wieder her, selbst wenn sie auf gesetzt isttrue
. Und da dies eine Konfigurationsoption ist, die irgendwann geändert werden könnte, ist es meiner Meinung nach empfehlenswert, manuell zu bereinigen, um sicherzustellen, dass Ihre Tests in Zukunft keine Probleme verursachen.Ein anderer Ansatz ist zu verwenden
process.env.NODE_ENV
. Auf diese Weise kann man selektiv auswählen, was beim Ausführen von Tests angezeigt werden soll (oder nicht):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'); }
oder
const logDev = msg => { if (process.env.NODE_ENV === 'development') { console.log(msg); } } logDev('Show output only while in "development" mode');
Dazu muss diese Konfiguration aktiviert sein
package.json
:"jest": { "globals": { "NODE_ENV": "test" } }
Beachten Sie, dass dieser Ansatz keine direkte Lösung für die ursprüngliche Frage darstellt, sondern das erwartete Ergebnis liefert, solange die Möglichkeit besteht, das
console.log
mit der genannten Bedingung zu versehen.quelle
===
durch!==
nach Ihren Wünschen. Ich benutze diesen Ansatz seit Jahren und er funktioniert einwandfrei, aber ich nehme Anpassungen entsprechend meinen Bedürfnissen vor.