You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:42:38