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

为什么Mocha测试中使用箭头函数代替直接函数调用会产生不同结果?

问题解答

核心结论

这个差异是JavaScript函数执行时机和Node.js内置assert模块的API约定共同导致的,既不是Mocha的特性,也不存在所谓的子函数自动mock跳过逻辑。

版本1运行失败的原因

assert.throws方法的第一个入参要求是未执行的函数引用,它会在内部调用该函数并捕获执行过程抛出的错误。
版本1中你传入的是sourceCode.myFunc(idontexist),这是一个立即执行的函数调用表达式:JavaScript引擎在把参数传递给assert.throws之前,就会先执行这个表达式拿到返回值,此时myFunc执行抛出的otherFunc相关错误直接暴露在assert.throws的捕获逻辑之外,根本无法进入后续的正则匹配流程,所以会直接报错匹配失败。

版本2的运行逻辑

版本2中你传入的() => sourceCode.myFunc(idontexist)是一个未执行的箭头函数引用,完整执行流程如下:

  1. assert.throws接收到这个函数引用后,会在自身内置的try/catch逻辑中主动调用该函数
  2. 函数执行时myFunc内部抛出的所有错误都会被assert.throws捕获
  3. 捕获到错误后,assert.throws会将错误信息和你传入的正则做匹配,因此可以正常完成校验
    整个过程没有跳过otherFunc的执行,只是错误的捕获范围从全局变成了assert.throws的内部逻辑而已。

内容的提问来源于stack exchange,提问作者phoenixdown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:51:01