新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/11/15 22:05:29来源:尧图网络
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),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/15 4:54:16

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/15 2:04:12

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/14 10:11:15

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/14 17:14:38

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/14 16:35:50

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/15 4:06:36

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉