使用Mocha测试Promise时遇错误:Promise被无真值原因拒绝
解决Mocha测试中Promise报错:Error: Promise rejected with no or falsy reason
嘿,这个问题我遇过好多次,咱们一步步拆解修复:
1. 报错的直接原因:Promise拒绝时未提供有效原因
你在parse方法里调用reject()时没有传入任何参数,Mocha对Promise的拒绝逻辑有严格要求——必须传递一个真值的错误原因(比如Error实例、描述性字符串),空的reject()会触发Error: Promise rejected with no or falsy reason这个报错。
2. 代码里的其他隐藏问题
除了reject的问题,你的代码还有两个明显bug:
- 构造函数里
this.jobExchange = this.jobExchange;是无效赋值,应该把传入的jobExchange参数赋值给实例属性 _isRelevant方法里的thi...是this的拼写错误,而且逻辑上应该比较job.exchange_name和实例的jobExchange属性
修复后的完整代码
class Parser { constructor(jobName, jobExchange) { this.jobName = jobName; // 修复:把传入的参数赋值给实例属性 this.jobExchange = jobExchange; } parse(job) { return new Promise((resolve, reject) => { try { // 建议把JSON.parse包裹在try/catch里,避免解析失败直接抛出同步错误 let jobJSON = JSON.parse(job.content); if (this._isRelevant(jobJSON)) { resolve(jobJSON); } else { // 修复:传递具体的错误原因 reject(new Error(`Job exchange ${job.exchange_name} is not relevant to ${this.jobExchange}`)); } } catch (err) { // 处理JSON解析失败的情况,同样传递错误原因 reject(new Error(`Failed to parse job content: ${err.message}`)); } }); } _isRelevant(job) { // 修复:拼写完整的this,并且正确对比属性 return job.exchange_name === this.jobExchange; } }
额外建议
- 把
JSON.parse放在try/catch块里,避免JSON格式错误时直接抛出同步异常(Promise会自动捕获,但显式处理更清晰) - 拒绝Promise时尽量使用
Error实例,而不是单纯的字符串,这样能保留调用栈信息,方便调试
内容的提问来源于stack exchange,提问作者Jarede
相关产品推荐
相关产品推荐

