【问题标题】:How to turn off logs from winston for jest如何关闭winston的日志以开玩笑
【发布时间】:2022-04-26 02:14:36
【问题描述】:

目前我正在使用 jest 测试一个 NodeJS 应用程序。特别是系统看起来像这样:

当我运行测试时,我喜欢对日志进行排序。尤其是在第一次测试,然后挖掘日志。我知道,那个玩笑有--silent 的选项。有趣的是,此选项不适用于温斯顿。 winston 的源代码看起来是在尝试直接写入 stdout/err。

有人知道,我如何在使用 --silent 选项运行测试时让 winston 保持沉默

【问题讨论】:

    标签: node.js npm jestjs


    【解决方案1】:

    您可以利用setupFilesAfterEnv jest option,将其指向一个模拟console 的文件。比如

    将此添加到jest.config.js:

    {
      ...
      setupFilesAfterEnv: ["./jest.setup.js"],
      ...
    }
    

    然后创建一个文件jest.setup.js

    global.beforeAll(() => {
      console.error = jest.fn().mockImplementation(() => {});
      console.info = jest.fn().mockImplementation(() => {});
      console.log = jest.fn().mockImplementation(() => {});
    });
    
    

    winston的源代码看起来是在尝试直接写入stdout/err。

    请注意,由于您将 winston 配置为打印到 stdout\stderr,因此上面的以下建议应该可以解决问题。当然,您可能希望为 --silent 标志添加额外的检查

    否则,您可以通过使用winston transport 的silent 属性来设置silence winston 的条件

    silent:如果为 true,则所有日志都被抑制

    【讨论】:

    • 遗憾的是,使控制台静音的方法对我不起作用。虽然我会像你说的那样尝试使用记录器配置使温斯顿静音。我只是想,有一个更简单的解决方案。
    • 是的。问题显然存在于winston/transports/console.js 文件中。在此文件中,winston 写入标准错误(如果可用)。显然在我的机器上就是这种情况。否则它使用控制台 api。
    • silent 为我工作,谢谢。简而言之:winston.createLogger({ silent: process.env.JEST_WORKER_ID !== undefined })
    【解决方案2】:

    要为您的 Jest 测试关闭 winston 日志,最佳做法是将传输器的 silent 属性与 NODE_ENV 一起使用,如下所示:

    var transporters = [new winston.transports.Console()];
    if (process.env.NODE_ENV === 'test') {
      transporters[0].silent = true;
    }
    

    这种方法适用于所有类型的传输,让您可以完全控制在测试中哪些传输器被静音,哪些不是。

    注意:开玩笑会set NODE_ENV to 'test' automatically。这种行为对于加载测试配置等其他测试场景也很有用。

    【讨论】:

      猜你喜欢
      • 2019-07-04
      • 2021-03-23
      • 2018-12-10
      • 2020-01-05
      • 1970-01-01
      • 2013-09-17
      • 2019-04-01
      • 1970-01-01
      • 2022-08-07
      相关资源
      最近更新 更多