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

如何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:41:13