Sinon/Chai:如何用一行代码验证抛出错误为指定Error实例
关于Chai断言单次同时验证错误类型和消息的问题
嘿,好问题!咱们直接说结论:你写的expect(()=>{ throw new Error('foo')}).to.throw(new Error('foo'))这种写法行不通,但确实有更简洁的单次检查方式来同时验证错误的类型和消息。
为什么直接传Error实例不行?
Chai的throw()断言在接收Error实例时,会做严格相等(===)检查——也就是说它会判断抛出的错误对象和你传入的new Error('foo')是不是同一个内存地址的对象。显然,你抛出的是一个新的Error实例,和断言里创建的那个完全是两个不同的对象,所以这种写法会导致测试失败。
正确的单次检查实现
Chai给throw()提供了重载,可以同时传入错误构造函数和消息字符串,这样一次断言就能完成类型和消息的双重验证:
expect(() => { throw new Error('foo') }).to.throw(Error, 'foo');
这个写法和你原来的链式调用expect(()=>{ throw new Error('foo')}).to.throw('foo').to.be.instanceOf(Error)效果完全一致,但更简洁。
额外补充:throw()的几种常用用法
- 只验证错误类型:
expect(() => { throw new Error('foo') }).to.throw(Error); - 只验证错误消息(支持模糊匹配,比如包含某段文本):
expect(() => { throw new Error('foo bar') }).to.throw('foo'); - 同时验证类型和精确消息:就是上面提到的
throw(Error, 'foo')
这样你就能用单次断言完成你需要的双重检查啦!
内容的提问来源于stack exchange,提问作者Mankind1023
相关产品推荐
相关产品推荐

