开玩笑:在执行console.error的实用程序功能中测试捕获案例?

时间:2018-08-10 20:47:47

标签: javascript jestjs

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

我有这个实用程序功能:

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并显示预期的错误消息。

在不更改此功能设计的情况下,有什么方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

首先,在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'
  );
});