当我想测试错误消息的输出时,我不明白期望柯里化(Currying)函数这一事实背后的原因是什么。如果它是一个 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');
});
最佳答案
expect
和 toThrow
只是函数调用。因此,为了使异常断言起作用,您作为 expect
参数传递的内容需要允许由测试框架控制的执行。
流程类似于:
expect()
将 lambda 保存为变量toThrow()
在try/catch
block 中执行保存的变量并测试捕获的异常。
如果没有 toThrow
方法,您将采用的方式类似于:
try {
calculateMedian({numbers: []};
fail();
} catch (err) {
expect(err.message).toBe('Cannot calcuate median without any numbers')
}
如果您不传递 lambda/函数而只是调用函数,则在程序控制到达 toThrow
方法之前将抛出错误。由于抛出的错误,测试将失败。
关于testing - 为什么 jest 期望匿名函数捕获错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58991188/