Changesets 原始程式碼中的 Logger 套件提供了有關在測試中靜默日誌訊息的文件。這讓我想知道變更集是如何做到這一點的,並讓我研究了它的原始程式碼。
我使用 Github 搜尋在 Changesets 儲存庫中搜尋了臨時 SilenceLogs。
讓我選擇暫時搜尋SilenceLogs的原因是Logger中提到了它
包自述文件。
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");
當你嘗試理解原始碼時,可以使用文件作為起點,搜尋變數和函數,為你在處理像 Changesets 這樣的大型專案時設定探索的方向。
以下程式碼摘自Changesets原始碼。
此函數接受一個函數作為參數,然後使用名為 createLogSilencer 的函數使日誌靜音。
注意這裡的設定功能:
const dispose = silencer.setup(); try { await testFn(); } finally { dispose(); }
以下程式碼選自變更集
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; }; }, }; };
這裡發生了什麼事?
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.返回設定
如果您注意到上面的內容,setup 會在臨時SilenceLogs 中調用,這是由 createLogSilencer 返回的
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; }; }, };
設定功能發生了什麼事?
2.1 記錄器和控制台 API 初始化為 jest.fn()
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();
這幾乎使日誌保持沉默,因為當您使用任何記錄器時都會呼叫 jest.fn(),因此這被視為設置,是使日誌保持沉默的重要步驟。
2.2 setUp 回傳原始記錄器
如果你注意到了,函數呼叫的順序是
a. const Silencer = createLogSilencer();
b. const dispose = Silencer.setup();
c.在finally 區塊中。
try { await testFn(); } finally { dispose(); }
dispose 由 createLogSilencer 傳回的 setup 函數傳回。此步驟將在執行測試函數後復原日誌記錄機制。
在 Thinkthroo,我們研究大型開源專案並提供架構指南。我們開發了使用 Tailwind 建構的可重複使用元件,您可以在專案中使用它們。我們提供 Next.js、React 和 Node 開發服務。
與我們預約會面討論您的專案。
https://github.com/changesets/changesets/tree/main/packages/logger#silencing-messages-in-tests
https://github.com/search?q=repo:changesets/changesets 暫時SilenceLogs &type=code
https://github.com/changesets/changesets/blob/baf56448606e005577dbe2fb1e78ff457dcaaefd/scripts/test-utils/src/index.ts#L16
以上是如何在測試中暫時靜音日誌的詳細內容。更多資訊請關注PHP中文網其他相關文章!