testing - 为什么 jest 期望匿名函数捕获错误?

标签 testing jestjs tdd

当我想测试错误消息的输出时,我不明白期望柯里化(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');
    });

最佳答案

expecttoThrow 只是函数调用。因此,为了使异常断言起作用,您作为 expect 参数传递的内容需要允许由测试框架控制的执行。

流程类似于:

  1. expect() 将 lambda 保存为变量
  2. 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/

相关文章:

javascript - 如何在 Express Jest 测试中清理/重置 redis-mock?

unit-testing - 应该如何使用 tdd 重复行为进行测试

testing - 如何让 chromedriver 在 android 上工作? java例子?

testing - 为什么我应该写 !== false 而不是 ==true?

testing - 使用 Jest 进行测试时模拟 native 模块

react-native - 类型错误 : Cannot read property 'default' of undefined when i use my own component as contentComponent in createDrawerNavigator

zend-framework - 如何对 zend Action Controller 进行单元测试?

java - 使用带有 restito 的自定义内容类型模拟 REST 请求

android - 为 TextFields 设置值

Spring 测试对服务事务的影响