Chai的expect.not.to.throw未捕获非预期错误且断言失效是什么原因
问题原因解析
1. 初始测试通过且无错误打印的原因
Chai的not.to.throw断言的判断逻辑是:只要被测函数抛出的错误不是你指定的错误类型/内容,断言就判定为通过。
你示例中被测函数抛出的是ReferenceError,而你指定排除的是TypeError,完全符合not.to.throw(TypeError)的判定条件,所以断言直接通过,Chai不会把匹配排除规则之外的错误抛出到外层,也不会默认打印,因此你看不到任何错误提示。
2. try/catch块中反向断言未生效的原因
你写的try块中的expect(() => parseInt(foo)).not.to.throw(TypeError)本身就是执行成功的,代码根本不会进入catch分支,因此catch块内的所有断言都不会执行,不管你写的是正向还是反向判断,都不会触发校验,所以测试仍然通过。
正确的测试写法
如果需要同时校验「不抛出TypeError,但抛出ReferenceError」,可以采用以下两种写法:
写法1:直接使用Chai的throw断言
describe('parseInt', () => { it('throws ReferenceError but not TypeError', () => { const testFn = () => parseInt(foo); // 先校验不抛指定类型错误 expect(testFn).not.to.throw(TypeError); // 再校验抛出预期类型错误 expect(testFn).to.throw(ReferenceError); }); });
写法2:手动捕获错误后校验
如果你需要对抛出的错误做更复杂的自定义判断,可以手动执行函数捕获错误:
describe('parseInt', () => { it('throws ReferenceError but not TypeError', () => { let thrownError = null; try { parseInt(foo); } catch (e) { thrownError = e; } expect(thrownError).to.be.a(ReferenceError); expect(thrownError).not.to.be.a(TypeError); }); });
内容的提问来源于stack exchange,提问作者Rich Apodaca
相关产品推荐
相关产品推荐

