Jest.js 当承诺被拒绝时,如何屏蔽响应查询控制台错误?

carvr3hs  于 2023-01-28  发布在  Jest
关注(0)|答案(2)|浏览(231)

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

7cwmlq89

7cwmlq891#

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 and teardown methods

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

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

如果您希望对套件中的所有测试禁用logger,您可以将调用添加到测试设置文件(例如,名为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
  })
})
smdncfj3

smdncfj32#

作为Nathan Arthur answer
React查询版本4(TanStack查询版本4)。setLogger函数已删除。了解更多信息。
它将改为在QueryClient选项内配置。

const queryClient = new QueryClient({
  logger: {
    log: (...args) => {
      // Log debugging information
    },
    warn: (...args) => {
      // Log warning
    },
    error: (...args) => {
      // Log error
    },
  },
})

参考:

相关问题