为什么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)是一个未执行的箭头函数引用,完整执行流程如下:
assert.throws接收到这个函数引用后,会在自身内置的try/catch逻辑中主动调用该函数- 函数执行时
myFunc内部抛出的所有错误都会被assert.throws捕获 - 捕获到错误后,
assert.throws会将错误信息和你传入的正则做匹配,因此可以正常完成校验
整个过程没有跳过otherFunc的执行,只是错误的捕获范围从全局变成了assert.throws的内部逻辑而已。
内容的提问来源于stack exchange,提问作者phoenixdown
相关产品推荐
相关产品推荐

