首頁 >web前端 >js教程 >如何在測試中暫時靜音日誌

如何在測試中暫時靜音日誌

Linda Hamilton
Linda Hamilton原創
2024-11-30 10:54:10330瀏覽

Changesets 原始程式碼中的 Logger 套件提供了有關在測試中靜默日誌訊息的文件。這讓我想知道變更集是如何做到這一點的,並讓我研究了它的原始程式碼。

變更集儲存庫搜尋靜默日誌

我使用 Github 搜尋在 Changesets 儲存庫中搜尋了臨時 SilenceLogs。

How to temporarily silence logs in tests

讓我選擇暫時搜尋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原始碼。

How to temporarily silence logs in tests

此函數接受一個函數作為參數,然後使用名為 createLogSilencer 的函數使日誌靜音。

注意這裡的設定功能:

const dispose = silencer.setup();
try {
 await testFn();
} finally {
 dispose();
}

createLogSilencer

以下程式碼選自變更集

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;
      };
    },
  };
};

這裡發生了什麼事?

  1. 作業
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 開發服務。

與我們預約會面討論您的專案。

How to temporarily silence logs in tests

參考資料:

  1. https://github.com/changesets/changesets/tree/main/packages/logger#silencing-messages-in-tests

  2. https://github.com/search?q=repo:changesets/changesets 暫時SilenceLogs &type=code

  3. https://github.com/changesets/changesets/blob/baf56448606e005577dbe2fb1e78ff457dcaaefd/scripts/test-utils/src/index.ts#L16

以上是如何在測試中暫時靜音日誌的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn