Bessere Methode zum Deaktivieren der Konsole innerhalb von Komponententests
Lesezeit: 6 Minuten
Apidcloud
Ich frage mich, ob es einen besseren Weg gibt, Konsolenfehler in a zu deaktivieren Spezifisch Scherztest (dh Wiederherstellung der Originalkonsole vor/nach jedem Test).
Hier 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, dasselbe zu erreichen? möchte ich vermeiden spyOnaber mockRestore scheint nur damit zu funktionieren.
Ich habe versehentlich einen echten Fehler versteckt, als ich dies tat. Idealerweise sollten Sie zuerst versuchen, eine Warnung oder einen Fehler zu diagnostizieren. Wenn es wirklich gutartig, es gibt unten viele Antworten, die helfen, es zu verbergen.
– Devin Rhode
6. September 2021 um 3:22 Uhr
@DevinRhode, es ist ein anständiger Rat. Aber es gibt Fälle, in denen eine Konsolenausgabe als Teil eines Tests erwartet wird, z. B. das Testen des Fehlerbehandlungscodes in einer Funktion. Und manchmal möchten Sie vielleicht Code von Drittanbietern aufrufen, der von der Konsole protokolliert wird, anstatt ihn zu verspotten.
– Erik Hermannsen
8. Januar um 23:02 Uhr
Raja Jaganathan
Für bestimmte Spezifikationsdateien ist die von Andreas gut genug. Das folgende Setup wird unterdrückt console.log Anweisungen für alle Testsuiten,
jest --silent
(oder)
Zum Anpassen warn, info and debug Sie können das folgende Setup verwenden
Prüfungen/setup.jsoderjest-preload.js konfiguriert ein 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(),
};
Hi! setupTestFrameworkScriptFile wird zugunsten von abgelehnt setupFilesAfterEnv.
– Elhoucin
25. Januar 2019 um 17:02 Uhr
Verspottung global.console ist in der Tat ein einfacher Weg und kann durch jede Konfiguration durchgeführt werden setupFilesAfterEnv . Achten Sie darauf, alle nativen Methoden des zu verspotten console Objekt oder Sie können auf andere unerwartete Fehler stoßen.
– Vadoranfrage
6. August 2019 um 14:17 Uhr
Beachten Sie, dass Sie, wenn Sie das Mock überprüfen (oder löschen) möchten, darauf als console.log verweisen müssen, z. B. Expect(console.log).toBeCalledTimes(1).
– Peter Gerde
22. Juni 2021 um 13:59 Uhr
Sie können auch hinzufügen "silent": true Möglichkeit zum jest.config.js Datei
– Finesse
29. November 2021 um 7:53 Uhr
Konstantin
Wenn Sie dies nur für einen bestimmten Test tun möchten:
Es funktioniert nicht in meinen Tests, ich habe noch einige console.warn während der Prüfung. Mehrfach getestet, ist es nicht kugelsicher
– Dimitri Kopriwa
15. März 2021 um 12:06 Uhr
Noice Toit Smort!
– Mike W
19. März 2021 um 16:47 Uhr
Ich weiß nicht, warum diese Antwort so viele Upvotes hat. Es ist eine großartige Möglichkeit, die Konsolenfunktion vor jedem Test zu deaktivieren (wie der name beforeEach würde bedeuten), aber es beantwortet nicht die Frage des OP, nämlich „wie man Konsolenfehler in a Spezifisch Scherztest“.
– fenix.shadow
15. September 2021 um 18:25 Uhr
@fenix.shadow lässt sich sehr einfach anpassen, um dies in einem einzigen Test zu tun. Alles, was innerhalb von a erledigt werden kann beforeEach kann innerhalb einer durchgeführt werden it. Was die Leute sagen, es funktioniert nicht … es funktioniert für mich. Möglicherweise möchten Sie auch den Fehler abfangen, der von der Standardfehlerbehandlungsroutine von Vue Test Utils ausgegeben wird.
– Ariane
7. Oktober 2021 um 15:46 Uhr
Da jede Testdatei in einem eigenen Thread läuft, muss sie nicht wiederhergestellt werden, wenn Sie sie für alle Tests in einer Datei deaktivieren möchten. Aus dem gleichen Grund kannst du auch einfach schreiben
Vielen Dank für die Info dazu. Es macht Sinn 🙂 Ich habe nach einer Möglichkeit gesucht, es nur innerhalb eines bestimmten Tests so zu machen, ohne es wiederherstellen zu müssen (ich dachte anfangs, das wäre das standardmäßige Verhalten), aber ich denke, bevor jeder den Trick macht.
– Apidcloud
12. Juni 2017 um 11:01 Uhr
Aber bei den nächsten Tests in derselben Datei wird es immer noch verspottet, oder? Je nach Situation ist das vielleicht nicht optimal.
– Ariane
7. Oktober 2021 um 15:47 Uhr
Dieser hat funktioniert
–Wolfgang
18. März um 15:28 Uhr
Ich fand, dass die obige Antwort zu: Unterdrückung console.log In allen Testsuiten wurden Fehler ausgegeben, wenn alle anderen console Methoden (zB warn, error) wurden aufgerufen, da es die gesamte globale ersetzte console Objekt.
Dieser etwas ähnliche Ansatz hat bei mir mit Jest 22+ funktioniert:
Nur mit dieser Methode console.log verspottet wird und anderes console Methoden sind davon nicht betroffen.
Für mich ist ein klarerer/saubererer Weg (der Leser benötigt wenig Wissen über die Jest-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;
Sie müssen auch console.info, console.error, console.warn usw. abdecken.
– Michael Oril
24. Oktober 2019 um 15:00 Uhr
@michael-liquori warum musst du die console.log neu starten? Ich denke, nach jeder Beschreibung werden die Mocks gelöscht
– Jhonatan
9. Juli 2020 um 14:03 Uhr
@Jhonatan Ich glaube nicht, dass es nach jeder Beschreibung klar ist, obwohl ich dies kürzlich nicht getestet habe, um sicherzugehen. Entsprechend Spaß docs da ist ein clearMocks und resetMocks Konfigurationsoption, aber beide standardmäßig false, und keines davon stellt die ursprüngliche Implementierung tatsächlich wieder her, selbst wenn es auf gesetzt ist true. Und wenn man bedenkt, dass dies eine Konfigurationsoption ist, die irgendwann geändert werden könnte, halte ich es für die beste Vorgehensweise, manuell zu bereinigen, um sicherzustellen, dass Ihre Tests in Zukunft keine Probleme verursachen.
Sie müssen auch console.info, console.error, console.warn usw. abdecken.
– Michael Oril
24. Oktober 2019 um 15:00 Uhr
@michael-liquori warum musst du die console.log neu starten? Ich denke, nach jeder Beschreibung werden die Mocks gelöscht
– Jhonatan
9. Juli 2020 um 14:03 Uhr
@Jhonatan Ich glaube nicht, dass es nach jeder Beschreibung klar ist, obwohl ich dies kürzlich nicht getestet habe, um sicherzugehen. Entsprechend Spaß docs da ist ein clearMocks und resetMocks Konfigurationsoption, aber beide standardmäßig false, und keines davon stellt die ursprüngliche Implementierung tatsächlich wieder her, selbst wenn es auf gesetzt ist true. Und wenn man bedenkt, dass dies eine Konfigurationsoption ist, die irgendwann geändert werden könnte, halte ich es für die beste Vorgehensweise, manuell zu bereinigen, um sicherzustellen, dass Ihre Tests in Zukunft keine Probleme verursachen.
– Michael Liquori
9. Juli 2020 um 20:23 Uhr
Dr-Klammer
Hier sind alle Zeilen, die Sie verwenden möchten. Sie können sie im Test richtig stellen:
jest.spyOn(console, 'warn').mockImplementation(() => {});
console.warn("You won't see me!")
expect(console.warn).toHaveBeenCalled();
console.warn.mockRestore();
14225200cookie-checkBessere Methode zum Deaktivieren der Konsole innerhalb von Komponententestsyes
Ich habe versehentlich einen echten Fehler versteckt, als ich dies tat. Idealerweise sollten Sie zuerst versuchen, eine Warnung oder einen Fehler zu diagnostizieren. Wenn es wirklich gutartig, es gibt unten viele Antworten, die helfen, es zu verbergen.
– Devin Rhode
6. September 2021 um 3:22 Uhr
@DevinRhode, es ist ein anständiger Rat. Aber es gibt Fälle, in denen eine Konsolenausgabe als Teil eines Tests erwartet wird, z. B. das Testen des Fehlerbehandlungscodes in einer Funktion. Und manchmal möchten Sie vielleicht Code von Drittanbietern aufrufen, der von der Konsole protokolliert wird, anstatt ihn zu verspotten.
– Erik Hermannsen
8. Januar um 23:02 Uhr