使用Sinon伪造函数时如何实现每次调用返回不同异步结果
Sinon 多次调用返回不同异步结果的解决方案
Sinon 本身已原生支持按调用顺序返回不同值,无需额外封装工具函数,推荐以下两种实现方案:
方案1:使用内置 onCall() 方法链式定义
通过 Fake 对象的 onCall(n) 方法指定第 N 次调用的返回规则,调用索引从 0 开始计数:
const sinon = require('sinon'); const targetFake = sinon.fake(); // 依次定义三次调用的异步返回值 targetFake.onCall(0).resolves(result1); targetFake.onCall(1).resolves(result2); targetFake.onCall(2).resolves(result3); // 可选:定义超出三次后的默认返回值,不设置则后续调用返回 undefined targetFake.resolves(defaultResult);
执行后三次调用的返回结果会严格按照定义的顺序返回,完全匹配你需要的 resolvesEach 效果。
方案2:自定义队列逻辑实现
如果需要动态调整返回队列、或者有更复杂的返回规则,可以自己封装带队列的 Fake 函数:
const resultQueue = [result1, result2, result3]; const targetFake = sinon.fake(async () => { // 按顺序取出队列头部值返回,队列空后可自定义兜底逻辑 return resultQueue.shift() ?? 'default value'; });
配套验证方式
测试结束后可以通过 Sinon 断言验证调用符合预期:
// 验证总调用次数为 3 sinon.assert.callCount(targetFake, 3); // 验证对应次数调用的传入参数符合预期 sinon.assert.calledWith(targetFake.secondCall, expectedParam);
内容的提问来源于stack exchange,提问作者czlowiek488
相关产品推荐
相关产品推荐

