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

如何使用Jest的mockImplementation正确模拟链式函数调用?

问题原因

你的实现存在两处核心问题:

  • 拼写错误:方法名getAggreegation多了一个字母e,和实际调用的getAggregation不匹配
  • 链式调用的每一步返回的是包含下一级方法的对象,而非直接返回下一级方法本身:byId()执行后需要返回带有getAggregation方法的对象,getAggregation()执行后需要返回带有setVisiblePagesCount方法的对象

正确实现

基础版本

如果仅需要实现链式调用不需要后续校验调用参数,可以直接用如下写法:

controller.byId = jest.fn(() => ({
  getAggregation: jest.fn(() => ({
    setVisiblePagesCount: jest.fn()
  }))
}))

可断言版本

如果需要后续验证每个方法的调用参数、调用次数,可以把mock实例单独提取出来:

// 单独定义各层级mock函数,方便后续断言
const mockSetVisiblePagesCount = jest.fn()
const mockGetAggregation = jest.fn(() => ({
  setVisiblePagesCount: mockSetVisiblePagesCount
}))
const mockById = jest.fn(() => ({
  getAggregation: mockGetAggregation
}))

controller.byId = mockById

// 执行业务代码后可做如下断言
expect(mockById).toHaveBeenCalledWith("ABC")
expect(mockGetAggregation).toHaveBeenCalledWith("EFG")
expect(mockSetVisiblePagesCount).toHaveBeenCalledWith(controller.test())

内容的提问来源于stack exchange,提问作者Soumya Kanti Naskar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:06:06