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

如何用Node.js原生测试库实现多次调用的不同Mock返回?

解决Node.js原生测试Mock多次调用返回不同值的问题

你之前用Sinon的写法(顺带提一句,你Sinon代码里连续三次onFirstCall其实只会生效最后一次,正确应该用onFirstCall、onSecondCall、onThirdCall,不过这是题外话),迁移到Node.js原生mock时踩了个小坑。

你的无效代码问题出在错误地调用了mock.fn().mock,mock.fn()返回的模拟函数本身就带有mockImplementationOnce方法,不需要去访问它的mock属性。直接在模拟函数上链式调用mockImplementationOnce就能实现多次调用返回不同值的需求。

正确的写法如下:

import { mock } from "node:test"

// 直接操作mock.fn()返回的函数,链式设置每次调用的返回值
const myMock = mock.fn()
  .mockImplementationOnce(() => 1)
  .mockImplementationOnce(() => 2)
  .mockImplementationOnce(() => 3)

functionWhichExecutesMyMockThreeTimes()

或者也可以分开写:

import { mock } from "node:test"

const myMock = mock.fn()
myMock.mockImplementationOnce(() => 1)
myMock.mockImplementationOnce(() => 2)
myMock.mockImplementationOnce(() => 3)

functionWhichExecutesMyMockThreeTimes()

这样不管黑盒函数里怎么调用这个mock,第一次调用返回1,第二次返回2,第三次返回3,完全符合你的需求。

补充说明:mock.fn()返回的对象的mock属性是用来查询调用记录的(比如myMock.mock.calls查看调用次数、参数等),不是用来设置实现逻辑的,所以之前的写法根本没把实现绑定到模拟函数上,自然无效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:23:13