如何Mock嵌套函数调用?解决inc不是函数的TypeError问题
解决Mock
stats.totalRequests.labels('incoming').inc(x) 报错的问题 我明白你的问题了——你需要Mock那段链式调用的统计代码,让它完全不执行原有逻辑,也不报错对吧?之前的两种方案踩了同一个坑:labels()返回的对象里没有inc方法,所以才会报TypeError: stats.totalRequests.labels(...).inc is not a function这个错误。
下面给你两种靠谱的解决方案,任选其一就行:
方案1:手动构造Mock对象(无需第三方库)
核心是让labels()返回一个包含inc方法的对象,而不是直接返回inc函数本身。代码可以这么写:
// 构造一个完全Mock的stats对象,链式调用每一步都有对应的结构 const stats = { totalRequests: { // labels方法返回一个带inc方法的对象,inc可以是空函数或者返回任意值 labels: () => ({ inc: () => {} // 不需要实际功能,空函数足够避免报错 }) } }; module.__set__('stats', stats);
这样当代码执行stats.totalRequests.labels('incoming').inc(x)时,每一步都能找到对应的方法,不会再报错,而且完全不会执行原有逻辑。
方案2:用Sinon进行链式Stub
如果你习惯用Sinon,需要对链式调用的每一层都做Stub,确保labels()返回的对象有incStub。代码示例:
const sinon = require('sinon'); // 先Stub inc方法,再让labels返回包含这个Stub的对象 const incStub = sinon.stub(); // 如果你不需要追踪调用,空Stub就行 const labelsStub = sinon.stub().returns({ inc: incStub }); const statsStub = { totalRequests: { labels: labelsStub } }; module.__set__('stats', statsStub);
或者更简洁的链式写法:
const sinon = require('sinon'); const statsStub = { totalRequests: { labels: sinon.stub().returns({ inc: sinon.stub() }) } }; module.__set__('stats', statsStub);
这样不管是调用inc(x)还是其他参数,都不会触发原有逻辑,也不会报错。如果之后需要验证调用情况(比如是否调用过inc、传了什么参数),还可以用Sinon的断言方法(比如incStub.calledWith(x))。
内容的提问来源于stack exchange,提问作者hihipriz
相关产品推荐
相关产品推荐

