Mocha无法识别抛出错误:.toThrowError断言失效问题咨询
问题根源:错误被内部
try/catch捕获,Mocha无法检测到 嘿,这问题我之前也踩过坑!核心原因很简单:你在代码里自己加了try/catch块,把抛出的错误直接捕获并打印了,没有让错误向外传播到Mocha的断言逻辑里。
Mocha的.toThrowError()断言的工作原理是监听目标函数执行时是否有未被捕获的错误抛出,现在你的catch块把错误“吞”掉了,Mocha自然感知不到,所以会提示断言失败。
解决方法
1. 移除内部的try/catch(最直接)
如果这段代码的设计就是要在不符合条件时抛出错误供上层处理,那直接去掉try/catch块就行:
let arr = []; existing.forEach((exists) => { arr.push(...this.dependencies[exists]); }); for (let x in arr){ if(existing.indexOf(arr[x]) == -1){ throw new Error('invalid'); } }
这样当触发throw时,错误会直接抛出去,Mocha的断言就能正常检测到了。
2. 抽离抛出逻辑单独测试(保留原有业务逻辑时)
如果你的业务代码确实需要try/catch来处理其他场景,但又要测试错误抛出的逻辑,可以把校验和抛出错误的部分抽成独立函数:
// 抽离的校验函数,专门用于测试 function validateDependencies(existing, dependencies) { let arr = []; existing.forEach((exists) => { arr.push(...dependencies[exists]); }); for (let x in arr){ if(existing.indexOf(arr[x]) == -1){ throw new Error('invalid'); } } } // 原有业务代码 try { validateDependencies(existing, this.dependencies); } catch(e){ console.log(e); }
然后在测试用例里直接断言validateDependencies函数:
expect(() => validateDependencies(testExisting, testDependencies)).toThrowError("invalid");
额外注意点
看你的错误提示里写的是Expected the function to throw an error matching: "Invalid Base Permissions",但代码里抛出的是'invalid'——还要确保断言的错误信息和实际抛出的完全一致(包括大小写、拼写),不然也会导致断言失败哦!
内容的提问来源于stack exchange,提问作者Phillip Smith
相关产品推荐
相关产品推荐

