尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

sinon 中的 stub.resolves():让 Stub 返回已兑现的 Promise,优雅测试异步代码

发布时间:2026/9/25 11:27:45

资讯中心
01
ARTICLE

sinon 中的 stub.resolves():让 Stub 返回已兑现的 Promise,优雅测试异步代码

sinon 中的 stub.resolves():让 Stub 返回已兑现的 Promise,优雅测试异步代码
测试开发工具【免费下载链接】sinonTest spies, stubs and mocks for JavaScript.项目地址https://gitcode.com/gh_mirrors/si/sinon点击查看免费下载stub.resolves(value)是 sinon 为测试桩stub提供的异步行为方法调用 stub 时不再直接返回值而是返回一个会兑现resolve为指定值的Promise。在测试基于 Promise 的异步代码如 fetch 封装、数据库驱动、定时任务时它让你用一行代码模拟异步操作成功的路径配合await/async与断言 API 即可完成可靠、可读的测试。读完本文你将掌握stub.resolves的完整用法、参数语义、底层实现原理以及它与stub.returns、stub.resolvesArg、stub.rejects等方法的取舍。基本用法import * as sinon from sinon; const stub sinon.stub().resolves(apple pie); const result await stub(); console.log(result); // apple pie调用stub.resolves(value)之后任何对 stub 的调用都会返回一个 Promise该 Promise 兑现为传入的value。上述最小示例正是仓库文档配套测试 docs/tests/docs/stubs/api/resolves.test.js 所验证的行为tap.test(stub.resolves, async (t) { const stub sinon.stub().resolves(apple pie); const result await stub(); t.equal(result, apple pie, stub resolves with the provided value); t.end(); });注意测试中调用处使用了await stub()——这是使用stub.resolves的关键stub 返回的是 Promise而不是普通值因此消费方必须用await、.then()或yield在 generator/co 场景下来获取最终值。在真实场景中模拟异步成功stub.resolves最常见的用途是替换真实异步依赖强制被测代码走成功分支。例如模拟读取文件import * as sinon from sinon; import * as fs from fs; // stub 掉 readFile让它返回一个 resolve 的 Promise sinon.stub(fs, readFile).resolves(Apple pie); const fileContent await fs.readFile(somefile); console.log(fileContent); // Apple pie再例如模拟一次网络请求的成功响应import * as sinon from sinon; const service { async getUser(id) { // 真实实现会发起 HTTP 请求 }, }; // 测试中让 getUser 永远成功返回用户对象 const stub sinon.stub(service, getUser).resolves({ id: 1, name: Eleanor }); const user await service.getUser(1); console.log(user.name); // Eleanor由于 stub 在包装已有方法时不会调用原函数参见 Stubs 概念文档stub.resolves可以完全屏蔽掉真实实现里的副作用网络请求、文件 IO、数据库连接让测试既快又稳定。参数与行为语义stub.resolves(value)接受一个参数参数类型说明value任意Promise 兑现时携带的值。可以是普通值、对象、数组甚至另一个 Promise此时会遵循 Promise 的展开语义被传入的值会原样作为 Promise 的兑现值。这一点与stub.returns的关键差异在于stub.returns(value)直接同步返回value而stub.resolves(value)返回的是Promise.resolve(value)的结果调用方必须异步消费。因此二者适用于不同风格的被测代码——同步调用用returnsPromise 化代码用resolves。底层实现原理stub.resolves的行为在 src/sinon/default-behaviors.js 中定义resolves: function resolves(fake, value) { fake.returnValue value; fake.resolve true; fake.resolveThis false; fake.reject false; fake.returnValueDefined true; fake.exception undefined; fake.exceptionCreator undefined; fake.fakeFn undefined; fake.callsThrough false; },它做的事情非常明确把value存入fake.returnValue置位fake.resolve true这是异步兑现的行为开关同时清空reject、resolveThis、异常、fakeFn、callsThrough等其它行为标志保证行为互斥、语义单一。真正的兑现动作发生在调用时刻由 src/sinon/behavior.js 的invoke完成} else if (this.resolve) { return (this.promiseLibrary || Promise).resolve(this.returnValue); } else if (this.reject) { return (this.promiseLibrary || Promise).reject(this.returnValue); }即stub 被调用时返回Promise.resolve(this.returnValue)也就是一个已经处于 fulfilled 状态的 Promise。从源码可以推断resolve与reject两个标志互斥因此同一时刻 stub 只会表现出兑现或拒绝中的一种行为——这也解释了为什么后设置的resolves/rejects会覆盖之前设置的行为。关于 promiseLibrary 的说明src/sinon/behavior.js 中的this.promiseLibrary || Promise表明默认使用全局Promise构造函数同时 src/sinon/stub.js 显示通过withArgs派生的 stub 会继承父 stub 的promiseLibrary设置使同一组参数化 stub 保持一致的 Promise 行为。这意味着stub.resolves返回的 Promise 类型可在特定场景下被定制。与其他异步/同步行为方法的搭配stub.resolves是 sinon异步行为家族的一员与以下方法配合可以覆盖几乎全部异步测试场景完整 API 见 Stubs API 索引stub.resolvesArg(index)返回一个兑现为第 index 个实参的 Promise若实参不足会抛出TypeErrorresolvesArg failed: N arguments required but only M present对应实现见 default-behaviors.js 与 behavior.js。stub.resolvesThis()兑现为调用时的this上下文docs/concepts/stubs/api/ 中与resolvesArg同族。stub.rejects()/stub.rejects(errorName, errorMessage)/stub.rejects(error)返回拒绝的 Promise用于模拟异步失败分支详见 stub.rejects 文档。stub.returns(value)同步返回普通值用于非异步被测代码docs/concepts/stubs/api/returns.md。按调用次数编排异步行为stub.resolves与onCall、onFirstCall、onSecondCall等组合可以编排第一次调用成功、第二次调用失败这类真实业务流程import * as sinon from sinon; const stub sinon.stub(); stub.onFirstCall().resolves(first batch); stub.onSecondCall().rejects(new Error(rate limited)); const first await stub(); // first batch const second await stub(); // 抛出 Error(rate limited)这在模拟重试逻辑、分页加载、轮询等场景中非常实用。与 Fakes 的对比与迁移建议sinon 官方在 Stubs 概念文档 中给出了重要建议新代码优先考虑使用sinon.fake。对于返回一个 resolve 的 Promise这一简单行为等价的 fake 写法是import * as sinon from sinon; const fake sinon.fake.resolves(apple pie); const result await fake(); // apple piesinon.fake.resolves的实现见 src/sinon/fake.js。Fake 更简单、行为不可变且拥有与 spy 相同的 API而 Stub 仍保留在需要onCall()分次行为、属性级替换stub(obj, prop)等高级场景的适用性。在既有基于 stub 的测试中stub.resolves依然是完全受支持且稳定的写法迁移时逐处替换并在调用处补上await即可。在沙箱sandbox中的使用在sinon.createSandbox创建的沙箱内调用sandbox.stub(...).resolves(...)会通过 src/sinon/sandbox.js 的addFakeBehaviorToCollection(resolves)将该行为登记进沙箱的 fake 集合从而让sandbox.restore()/sandbox.resetBehavior()一并管理这些 stub 的还原与重置避免测试间的相互污染import * as sinon from sinon; const sandbox sinon.createSandbox(); const service { async fetchConfig() { /* ... */ }, }; sandbox.stub(service, fetchConfig).resolves({ theme: dark }); const config await service.fetchConfig(); console.log(config.theme); // dark sandbox.restore(); // 一次性还原所有被替换的方法常见陷阱与最佳实践调用处必须异步消费const r stub.resolves(1); const v stub();得到的是 Promise 而非1忘记await是使用stub.resolves最常见的错误。行为互斥、后设覆盖对同一 stub 依次调用resolves、returns、throws等方法后一次会清空前一次设置的标志见default-behaviors.js中resolves对exception、fakeFn、callsThrough等的重置需要不同调用不同行为时请改用onCall。值可为 Promise传入另一个 Promise 时Promise.resolve会按 Promise 展开语义等待其落定可用于链式组合异步依赖。优先使用 fake仅需返回兑现的 Promise这一简单行为时sinon.fake.resolves是官方推荐的首选stub 更适合分次编排与属性替换的高级场景。综上stub.resolves提供了一种声明式、可读性强的方式让测试桩在异步场景下返回成功结果其底层由resolve标志与Promise.resolve调用链支撑实现清晰、行为可预测。结合rejects、resolvesArg、onCall与沙箱机制你可以完整覆盖异步代码的成功、失败、参数化与顺序化分支测试。赞分享测试开发工具【免费下载链接】sinonTest spies, stubs and mocks for JavaScript.项目地址https://gitcode.com/gh_mirrors/si/sinon点击查看免费下载相关推荐Envoy 上游集群运行时设置Cluster Runtime完全指南健康检查、异常点驱逐、熔断与区域感知负载均衡Envoy 上游集群运行时设置Cluster Runtime完全指南健康检查、异常点驱逐、熔断与区域感知负载均衡 导读 Envoy 的集群管理Clust测试开发工具Sinon fake.resolves 深度解析创建返回已解决 Promise 的 JavaScript 测试替身Sinon fake.resolves 深度解析创建返回已解决 Promise 的 JavaScript 测试替身 fake.resolves value 是测试开发工具Sinon fake.rejects 完全指南创建返回拒绝 Promise 的测试替身Sinon fake.rejects 完全指南创建返回拒绝 Promise 的测试替身 fake.rejects value 是 Sinon fakes AP测试开发工具上一篇Qwerty Learner免费开源的打字练习软件让英语学习和肌肉记忆完美融合下一篇终极键盘打字练习指南Qwerty Learner 免费安装与使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。