首页 > 解决方案 > 笑话:在执行 console.error 的实用程序函数中测试 catch case?

问题描述

不确定这是否可以测试(可能需要重新考虑该功能)。

我有这个实用功能:

const getProp = (propKey) => {
  const env = getCurrentEnvironment();
  let prop = '';
  try {
      prop = constants.PROPS_TABLE[env][propKey];
  } catch (err) {
      const errorMsg = `Property not found for environment ${env} using key ${propKey}`;
      console.error(errorMsg);
  }
  return prop === undefined ? '' : prop;
};

并且我对快乐路径进行了测试,但我想证明错误路径将调用 console.error 并显示预期的错误消息。

有没有办法在不改变这个功能的设计的情况下做到这一点?

标签: javascriptjestjs

解决方案


首先,它在 I/O 中直接对控制台产生副作用这一事实并不好 - 但有时这就是生活。

你可以:

  • 保留对旧console.error值的引用 -var error = console.error
  • console.error-console.error = jest.fn()
  • 断言它被称为expect(console.error.mock.calls[0][0]).toBe('“未找到环境的属性 ....')`,并带有确切的参数
  • 恢复console.error为原始值afterEach

总而言之,它是这样的:

var error = console.error;

afterEach(() => {
  console.error = error; // revert the spy
});

test('your fn', () => {
  console.error = jest.fn();
  setCurrentEnvironment('test'); // or whatever getCurrentEnvironment accesses
  expect(getProp('non existing')).toBe('');
  expect(console.error.mocks.calls[0][0]).toBe(
    'Property not found for environment test using key non existing'
  );
});

推荐阅读