为什么开玩笑期望匿名函数捕获错误?

时间:2019-11-22 09:28:19

标签: testing jestjs tdd

当我想测试错误消息的输出时,我不希望使用咖喱函数,这是什么原因?如果它将是一个return值,则直接调用该函数将导致在.toBe

中正确测试该值
function calculateMedian({numbers}) {
if (Array.isArray(numbers) && numbers.length === 0) {
        throw new Error('Cannot calcuate median without any numbers');
    }
}

但是,如果我要测试以下没有匿名功能的代码,则测试只会失败。背后的原因是什么?

通过测试

    it('should throw an error when given an empty array', () => {
        expect(() =>
            calculateMedian({
                numbers: [],
            }),
        ).toThrow('Cannot calcuate median without any numbers');
    });

测试失败

    it('should throw an error when given an empty array', () => {
        expect(calculateMedian({numbers: []})
        ).toThrow('Cannot calcuate median without any numbers');
    });

1 个答案:

答案 0 :(得分:0)

define('DB_SERVER', 'db-container'); // if use the docker expect只是函数调用。因此,为了使对异常的断言起作用,您作为toThrow参数传递的内容需要允许测试框架控制执行。

流程类似于:

  1. expect将lambda保存为变量
  2. expect()toThrow()块中执行保存的变量并测试捕获的异常。

不使用try/catch方法的情况将类似于:

toThrow

如果不传递lambda /函数而仅调用函数,则将在程序控制到达try { calculateMedian({numbers: []}; fail(); } catch (err) { expect(err.message).toBe('Cannot calcuate median without any numbers') } 方法之前引发错误。由于抛出错误,测试将失败。