开玩笑:在单元测试中禁用控制台的更好方法

2022-08-30 01:29:23

我想知道是否有更好的方法可以在特定的Jest测试禁用控制台错误(即,在每次测试之前/之后恢复原始控制台)。

以下是我目前的方法:

describe("Some description", () => {
  let consoleSpy;

  beforeEach(() => {
    if (typeof consoleSpy === "function") {
      consoleSpy.mockRestore();
    }
  });

  test("Some test that should not output errors to jest console", () => {
    expect.assertions(2);

    consoleSpy = jest.spyOn(console, "error").mockImplementation();

    // some function that uses console error
    expect(someFunction).toBe("X");
    expect(consoleSpy).toHaveBeenCalled();
  });

  test("Test that has console available", () => {
    // shows up during jest watch test, just as intended
    console.error("test");
  });
});

有没有一种更简洁的方法来完成同样的事情?我想避免spyOn,但mockRestore似乎只与它一起工作

谢谢!


答案 1

对于特定的规范文件,安德烈亚斯的已经足够好了。下面的设置将禁止所有测试套件的语句,console.log

jest --silent

(或)

要自定义,您可以使用以下设置warn, info and debug

测试/设置.js jest-preload.js 配置于setupFilesAfterEnv

global.console = {
  ...console,
  // uncomment to ignore a specific log level
  log: jest.fn(),
  debug: jest.fn(),
  info: jest.fn(),
  // warn: jest.fn(),
  // error: jest.fn(),
};

jest.config.js

module.exports = {
    verbose: true,
    setupFilesAfterEnv: ["<rootDir>/__tests__/setup.js"],
};

答案 2

如果您只想进行特定测试:

beforeEach(() => {
  jest.spyOn(console, 'warn').mockImplementation(() => {});
});