Heim >Web-Frontend >js-Tutorial >So schalten Sie Protokolle in Tests vorübergehend stumm
Das Logger-Paket im Changesets-Quellcode bietet eine Dokumentation zum Stummschalten von Protokollnachrichten in Tests. Das brachte mich dazu, mich zu fragen, wie Changesets das machen, und veranlasste mich, einen Blick in den Quellcode zu werfen.
Ich habe mithilfe der Github-Suche im gesamten Changesets-Repository nach temporarySilenceLogs gesucht.
Was mich dazu bewogen hat, nach temporarySilenceLogs zu suchen, ist die Tatsache, dass es im Logger erwähnt wird
Paket Readme.
import { temporarilySilenceLogs } from "@changesets/test-utils"; import { log } from "@changesets/logger"; temporarilySilenceLogs(); // Now the logs in this test file are not actually logged to std out log("I am not logged"); // Use console.log to log messages in tests if required console.log("Yay, I am logged");
Wenn Sie versuchen, den Quellcode zu verstehen, können Sie die Dokumentation als Ausgangspunkt verwenden und nach Variablen und Funktionen suchen, um die Richtung für Ihre Erkundung festzulegen, wenn Sie es mit großen Projekten wie Changesets zu tun haben.
Der folgende Code wurde aus dem Changesets-Quellcode ausgewählt.
Diese Funktion akzeptiert eine Funktion als Argument und schaltet die Protokolle dann mithilfe einer Funktion namens „createLogSilencer“ stumm.
Achten Sie hier auf die Setup-Funktion:
const dispose = silencer.setup(); try { await testFn(); } finally { dispose(); }
Der folgende Code wird aus Changesets ausgewählt
const createLogSilencer = () => { const originalLoggerError = logger.error; const originalLoggerInfo = logger.info; const originalLoggerLog = logger.log; const originalLoggerWarn = logger.warn; const originalLoggerSuccess = logger.success; const originalConsoleError = console.error; const originalConsoleInfo = console.info; const originalConsoleLog = console.log; const originalConsoleWarn = console.warn; const originalStdoutWrite = process.stdout.write; const originalStderrWrite = process.stderr.write; return { setup() { logger.error = jest.fn(); logger.info = jest.fn(); logger.log = jest.fn(); logger.warn = jest.fn(); logger.success = jest.fn(); console.error = jest.fn(); console.info = jest.fn(); console.log = jest.fn(); console.warn = jest.fn(); process.stdout.write = jest.fn(); process.stderr.write = jest.fn(); return () => { logger.error = originalLoggerError; logger.info = originalLoggerInfo; logger.log = originalLoggerLog; logger.warn = originalLoggerWarn; logger.success = originalLoggerSuccess; console.error = originalConsoleError; console.info = originalConsoleInfo; console.log = originalConsoleLog; console.warn = originalConsoleWarn; process.stdout.write = originalStdoutWrite; process.stderr.write = originalStderrWrite; }; }, }; };
Was passiert hier?
const originalLoggerError = logger.error; const originalLoggerInfo = logger.info; const originalLoggerLog = logger.log; const originalLoggerWarn = logger.warn; const originalLoggerSuccess = logger.success; const originalConsoleError = console.error; const originalConsoleInfo = console.info; const originalConsoleLog = console.log; const originalConsoleWarn = console.warn; const originalStdoutWrite = process.stdout.write; const originalStderrWrite = process.stderr.write;
2. Gibt setup
zurückWenn Sie oben bemerkt haben, wird Setup innerhalb von temporarySilenceLogs aufgerufen, dies wird von createLogSilencer zurückgegeben
return { setup() { logger.error = jest.fn(); logger.info = jest.fn(); logger.log = jest.fn(); logger.warn = jest.fn(); logger.success = jest.fn(); console.error = jest.fn(); console.info = jest.fn(); console.log = jest.fn(); console.warn = jest.fn(); process.stdout.write = jest.fn(); process.stderr.write = jest.fn(); return () => { logger.error = originalLoggerError; logger.info = originalLoggerInfo; logger.log = originalLoggerLog; logger.warn = originalLoggerWarn; logger.success = originalLoggerSuccess; console.error = originalConsoleError; console.info = originalConsoleInfo; console.log = originalConsoleLog; console.warn = originalConsoleWarn; process.stdout.write = originalStdoutWrite; process.stderr.write = originalStderrWrite; }; }, };
Was passiert in der Setup-Funktion?
2.1 Logger und Konsolen-API werden mit jest.fn() initialisiert
logger.error = jest.fn(); logger.info = jest.fn(); logger.log = jest.fn(); logger.warn = jest.fn(); logger.success = jest.fn(); console.error = jest.fn(); console.info = jest.fn(); console.log = jest.fn(); console.warn = jest.fn(); process.stdout.write = jest.fn(); process.stderr.write = jest.fn();
Dadurch werden die Protokolle praktisch stummgeschaltet, da jest.fn() aufgerufen wird, wenn Sie einen Logger verwenden. Daher wird dies als Setup betrachtet, ein wichtiger Schritt, um Ihre Protokolle stummzuschalten.
2.2 setUp gibt Original-Logger zurück
Wenn Sie es bemerkt haben, ist die Reihenfolge der Funktionsaufrufe
a. const silencer = createLogSilencer();
B. const dispose = silencer.setup();
C. Im „finally“-Block.
try { await testFn(); } finally { dispose(); }
dispose wird von der Setup-Funktion zurückgegeben, die von createLogSilencer zurückgegeben wird. Dieser Schritt stellt den Protokollierungsmechanismus nach der Ausführung Ihrer Testfunktion wieder her.
Bei Thinkthroo studieren wir große Open-Source-Projekte und stellen Architekturführer zur Verfügung. Wir haben mit Rückenwind wiederverwendbare Komponenten entwickelt, die Sie in Ihrem Projekt nutzen können. Wir bieten Next.js-, React- und Node-Entwicklungsdienste an.
Buchen Sie einen Termin mit uns, um Ihr Projekt zu besprechen.
https://github.com/changesets/changesets/tree/main/packages/logger#silencing-messages-in-tests
https://github.com/search?q=repo:changesets/changesets temporarySilenceLogs &type=code
https://github.com/changesets/changesets/blob/baf56448606e005577dbe2fb1e78ff457dcaaefd/scripts/test-utils/src/index.ts#L16
Das obige ist der detaillierte Inhalt vonSo schalten Sie Protokolle in Tests vorübergehend stumm. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!