2

我正在测试一个由react-query. 当一个承诺被拒绝时,我需要测试它的回滚行为。不幸的是,react-query日志拒绝了使用 对控制台的承诺console.error,这弄脏了我的测试输出。如何防止react-query将被拒绝的承诺记录为控制台错误?

4

1 回答 1

9

react-query有一个名为setLogger曾经被调用setConsole)的方法,您可以使用它来实现此目的。

要将来自的所有控制台消息静音react-query

setLogger({
    log: () => {},
    warn: () => {},
    error: () => {},
});

再次取消静音react-query

setLogger(window.console);

如果您只想静音某些级别而不静音其他级别,您可以通过设置空函数和window.console函数的任意组合。例如:

setLogger({
    log: () => {},
    warn: window.console.warn,
    error: window.console.error,
});

如果您只想将记录器静音以进行单个测试,则可以在相关测试的开始和结束时进行这些调用。

如果您希望将整个测试文件的记录器静音,您可以使用 Jest 的setup 和 teardown 方法

beforeAll(() => {
  setLogger({
    log: () => {},
    warn: () => {},
    error: () => {},
  });
});

afterAll(() => {
  setLogger(window.console);
});

如果您希望为套件中的所有测试静音记录器,您可以将调用添加到测试设置文件(例如命名为testSetup.js),然后将以下内容添加到您的 jest 配置中:

setupFilesAfterEnv: ['<rootDir>/testSetup.js'],

我个人创建了一个辅助函数以在我的测试中使用(TypeScript):

export async function withMutedReactQueryLogger(
  func: () => Promise<any>
): Promise<any> {
  const noop = () => {
    // do nothing
  };

  setLogger({
    log: noop,
    warn: noop,
    error: noop,
  });

  const result = await func();

  setLogger(window.console);

  return result;
}

我这样使用它:

test('test something', async () => {
  await withMutedReactQueryLogger(async () => {
    // write my test here
  })
})
于 2021-01-04T22:04:36.893 回答