首页 >web前端 >js教程 >如何在测试中暂时静音日志

如何在测试中暂时静音日志

Linda Hamilton
Linda Hamilton原创
2024-11-30 10:54:10280浏览

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