我想知道是否有更好的方法在特定的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似乎只与它一起工作。


当前回答

由于每个测试文件都在自己的线程中运行,因此如果您想在一个文件中禁用所有测试,则不需要恢复它。出于同样的原因,你也可以只写

console.log = jest.fn()
expect(console.log).toHaveBeenCalled();

其他回答

对于特定的规格文件,Andreas的已经足够好了。下面的setup将对所有测试套件禁用console.log语句,

jest --silent

(or)

要自定义警告,信息和调试,您可以使用下面的设置

setupFilesAfterEnv中配置的tests/setup.js或jest-preload.js

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

向@Raja的最佳答案致敬。这是我正在使用的(我会注释,但不能在注释中共享多行代码块)。

与jest v26,我得到这个错误:

We detected setupFilesAfterEnv in your package.json.

Remove it from Jest configuration, and put the initialization code in src/setupTests.js:
This file will be loaded automatically.

因此,我不得不从我的jest配置中删除setupFilesAfterEnv,并将其添加到src/setupTests.js中

// https://stackoverflow.com/questions/44467657/jest-better-way-to-disable-console-inside-unit-tests
const nativeConsoleError = global.console.error

global.console.error = (...args) => {
  if (args.join('').includes('Could not parse CSS stylesheet')) {
    return
  }
  return nativeConsoleError(...args)
}

这里是你可能会用到的所有台词。你可以把它们放在测试中:

jest.spyOn(console, 'warn').mockImplementation(() => {});
console.warn("You won't see me!")
expect(console.warn).toHaveBeenCalled();
console.warn.mockRestore();

对我来说,一个更清晰/干净的方式(读者需要很少的笑话API知识来理解发生了什么),就是手动做mockRestore所做的事情:

// at start of test you want to suppress
const consoleLog = console.log;
console.log = jest.fn();

// at end of test
console.log = consoleLog;

因为笑话。我开玩笑地说:“间谍在这方面行不通(过去可能有用)。”fn使用Jest文档中指出的手动模拟恢复。这样,您就不会错过任何在特定测试中没有被经验忽略的日志。

const consoleError = console.error beforeEach(() => { 控制台。error = consoleError }) Test('错误',()=> { 控制台。Error = jest.fn() Console.error ('error') //无法看到我 }) 测试('有错误和日志',()=> { Console.error ('error') //现在可以 })