sinon sandbox.verify:批量校验沙箱内全部 Mock 期望值的权威指南
测试开发工具【免费下载链接】sinonTest spies, stubs and mocks for JavaScript.项目地址https://gitcode.com/gh_mirrors/si/sinon点击查看免费下载sandbox.verify()是 sinon 沙箱sandbox体系中用于一次性校验所有经由该沙箱创建的 Mock 期望是否被满足的入口方法。在默认沙箱模式下它直接以sinon.verify()的形式调用是编写基于 Mock 的单元测试时收尾断言的关键一步。读完本文你将掌握verify的调用方式、失败时的异常行为与错误信息格式、它与其他沙箱方法restore、verifyAndRestore的分工以及其底层实现原理对应源码 src/sinon/sandbox.js 与 src/sinon/mock.js。沙箱与sandbox.verify的定位在深入verify之前需要先明确它所属的沙箱模型。自sinon5.0.0起sinon根对象本身就是一个默认沙箱default sandbox除非你有非常特殊的配置需求否则通常只需要直接使用它而不必调用sinon.createSandbox()创建新沙箱参见 Sandbox API 总览 与 createSandbox 说明。沙箱的核心价值在于分组管理通过同一个沙箱创建的所有 fakesfake / spy / stub与 mocks可以统一执行restore、reset、verify等批量操作避免逐一清理的繁琐与遗漏。sandbox.verify负责的正是其中校验这一环其官方语义是Verifies all mocks created through the sandbox. 校验所有经由该沙箱创建的 Mock。需要特别强调的是sandbox.verify()只校验沙箱内创建的 Mock及其期望 expectation它不会去校验 spy/stub 的调用断言——那些断言通常通过sinon.assert或expect库完成。这一点从命名与实现上都与mock.verify校验单个 Mock 的全部期望形成对应关系。基本用法在默认沙箱上调用sinon.verify()由于sinon根对象就是默认沙箱sandbox.verify()在日常代码中通常写作sinon.verify()。下面的完整示例取自仓库中的对应测试 docs/tests/docs/sandboxes/api/verify.test.js它演示了创建 Mock → 设置期望 → 校验失败抛出异常的完整链路import tap from tap; import * as sinon from sinon; tap.test(sandbox.verify - verifies all mocks, (t) { // The sinon root object is a default sandbox const obj { greet: function (name) { return Hello ${name}; } }; const mock sinon.mock(obj); const expectation mock.expects(greet); // verify will throw because of the unmet expectation t.throws( () sinon.verify(), /Expected greet\(\[...\]\) once \(never called\)/, throws when expectation not met ); sinon.restore(); t.end(); });逐段拆解这个流程创建 Mocksinon.mock(obj)基于普通对象obj生成一个 Mock并挂到默认沙箱的收集列表中设置期望mock.expects(greet)声明对greet方法的一次调用期望默认once即期望恰好被调用一次触发校验由于示例中从未调用obj.greet(...)期望未被满足sinon.verify()会抛出异常验证异常t.throws(...)断言抛出的异常信息匹配/Expected greet\(\[...\]\) once \(never called\)/清理收尾sinon.restore()恢复所有被替换/包装的方法避免污染其他测试。若期望被满足例如在调用verify()之前执行了obj.greet(World)则sinon.verify()静默返回、不抛异常测试正常通过。失败行为异常抛出与错误信息格式verify与普通断言的关键差异在于失败时的行为方式当沙箱内任一 Mock 的任一期望未被满足时sandbox.verify()会抛出异常throw而不是返回布尔值或仅打印警告。异常消息会明确指出哪个方法、以何种参数、期望调用几次、实际调用情况。以上述示例为例错误信息形如Expected greet([...]) once (never called)这条信息的结构对应 sinon Mock 期望expectation的字符串化输出greet被期望的方法名[...]期望接收的参数模式[...]表示参数占位/匹配规则once期望的调用次数默认是恰好一次never called实际调用情况从未被调用。如果存在多个未满足的期望错误信息会将它们逐条列出并聚合。从 src/sinon/mock.js 第 94–114 行的mock.verify实现可以看到它对每个代理方法proxy逐一检查其全部期望未满足的期望字符串被压入messages已满足的进入met随后if (messages.length 0) { mockExpectation.fail(join(concat(messages, met), \n)); } else if (met.length 0) { mockExpectation.pass(join(concat(messages, met), \n)); }即只要有任一期望未满足就通过mockExpectation.fail以换行分隔的聚合消息抛出失败全部满足则走pass分支正常返回。与mock.verify的层级关系理解sandbox.verify的最佳方式是与单点方法mock.verify对照方法作用范围失败行为附带效果mock.verify()单个 Mock 对象上的全部期望抛出异常会恢复该 Mock 包装的所有方法见 mock.verify 文档sandbox.verify()沙箱内收集的所有Mock抛出异常首个/聚合失败本身不执行恢复需另行调用restoremock.verify在 src/sinon/mock.js 中还有一个值得注意的细节校验完成时会调用this.restore()恢复被 Mock 替换的方法。而sandbox.verify在 src/sinon/sandbox.js 第 289–291 行的实现则非常简洁sandbox.verify function verify() { applyOnEach(collection, verify); };它通过applyOnEach对沙箱收集列表collection中的每个条目调用其verify方法——所以沙箱级校验本质上就是把mock.verify批量应用一遍。沙箱自身不附带恢复逻辑因此测试中通常要在verify之后或通过verifyAndRestore调用restore。verifyAndRestore校验与恢复一步到位针对校验失败也要保证清理的常见场景沙箱提供了组合方法sandbox.verifyAndRestore()详见 verify-and-restore 文档其语义为Verifies all mocks and restores all fakes created through the sandbox. 校验所有 Mock并恢复所有经沙箱创建的 fakes。它的关键特性是即使校验失败抛出了异常恢复动作依然会执行。仓库测试 docs/tests/docs/sandboxes/api/verify-and-restore.test.js 完整验证了这一行为const obj { greet: function (name) { return Hello ${name}; } }; const mock sinon.mock(obj); const expectation mock.expects(greet); // mocked methods have a restore method on them t.equal(typeof obj.greet.restore, function, mocked method has restore function); // verify will throw because of the unmet expectation t.throws( () sinon.verifyAndRestore(), /Expected greet\(\[...\]\) once \(never called\)/, throws when expectation not met ); // but the restore part will still be performed t.equal(typeof obj.greet.restore, undefined, method restored even though verify failed);注意测试中的两个断言点Mock 包装后的方法带上了restore函数typeof obj.greet.restore function即使verifyAndRestore()因期望未满足而抛错原方法也已被恢复typeof obj.greet.restore undefined。其实现原理在 src/sinon/sandbox.js 第 293–307 行通过try/catch捕获verify抛出的异常无论成败都执行sandbox.restore()最后再把异常重新抛出sandbox.verifyAndRestore function verifyAndRestore() { let exception; try { sandbox.verify(); } catch (e) { exception e; } sandbox.restore(); if (exception) { throw exception; } };这样的设计保证了单个用例即使 Mock 校验失败也不会把被替换的方法残留到后续用例中从而避免失败级联污染。源码级原理applyOnEach与 Mock 期望校验流程如果把sandbox.verify的调用链展开可以得到清晰的执行脉络sinon.verify()→sandbox.verify()src/sinon/sandbox.jsapplyOnEach(collection, verify)遍历沙箱收集列表对每个条目调用其verify方法对 Mock 条目进入mock.verifysrc/sinon/mock.js遍历该 Mock 的每个代理方法this.proxies遍历每个方法的全部期望expectations[proxy]调用expectation.met()判断是否满足未满足的期望字符串进入messages满足的进入met调用this.restore()恢复被替换的方法若存在未满足期望聚合所有消息后mockExpectation.fail(...)抛出异常异常向上传播sandbox.verify()调用点直接收到抛出结果。值得注意的边界行为verify只作用于沙箱内创建的 Mock。沙箱同样收集 spy/stub它们也出现在collection中但 spy/stub 并不具备verify语义因此批量校验对它们无实际效果——这正是文档明确定义校验所有 Mock的原因sandbox.restore()不接受任何参数如果误传参数会抛出sandbox.restore() does not take any parameters. Perhaps you meant stub.restore()的提示错误见 src/sinon/sandbox.js这也能帮助新手区分沙箱级恢复与单个 stub 恢复。最佳实践与注意事项结合文档与源码实现使用sandbox.verify()时建议遵循以下实践默认优先用根沙箱多数测试直接sinon.mock()sinon.verify()即可无需createSandbox()create-sandbox.md 明确警告除非有非常高级的场景否则应使用sinon对象上的默认沙箱善用verifyAndRestore做收尾在afterEach/t.teardown等清理钩子中调用sinon.verifyAndRestore()可以同时完成断言全部期望 恢复全部替换且失败时也不遗漏恢复分离校验与恢复的关注点如果希望先看到所有失败信息再做清理或需要自定义恢复顺序可分开调用sinon.verify()置于断言区与sinon.restore()置于清理区理解错误信息的可读性聚合的失败消息按方法逐个列出期望与调用情况排错时优先看never called、called with wrong arguments等关键词定位未满足的期望不要指望verify校验 spy/stub 断言spy/stub 的调用次数、参数等断言请使用sinon.assert或mock的期望机制sandbox.verify只覆盖 Mock 期望。通过默认沙箱 sinon.verify()或sinon.verifyAndRestore()的组合你可以用最少的样板代码实现对 Mock 期望的集中校验与资源的可靠清理这正是 sinon 沙箱设计中最实用的能力之一。赞分享测试开发工具【免费下载链接】sinonTest spies, stubs and mocks for JavaScript.项目地址https://gitcode.com/gh_mirrors/si/sinon点击查看免费下载相关推荐如何高效配置Daytona沙箱期望状态目标设定与特性配置完全指南如何高效配置Daytona沙箱期望状态目标设定与特性配置完全指南 Daytona作为开源开发环境管理器其沙箱功能允许开发者创建隔离、可定制的开发环境。沙箱期miniblink49 仓库中的 Google Mockgmock入门指南从 Mock 类定义到期望验证miniblink49 仓库中的 Google Mockgmock入门指南从 Mock 类定义到期望验证 本文以 v8_7_5/testing/gmock前端桌面应用Sinon assert.threw 完全指南断言 fake、spy、stub 抛出异常的权威方法Sinon assert.threw 完全指南断言 fake、spy、stub 抛出异常的权威方法 assert.threw 是 Sinon 内置断言Ass测试开发工具上一篇Renovate 的 Gradle Manager 深度解析自定义解析器、Wrapper 安全执行与锁文件/依赖校验更新下一篇JDK jpackage Windows MSI 安装器 UI 控制事件ControlEvents深度解析以 licenseshortcut_prompt 组合为例创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Atlas 300V 24G上部署YOLO:从ONNX到OM的完整推理实践

Atlas 300V 24G上部署YOLO:从ONNX到OM的完整推理实践

如果你准备在昇腾Atlas平台上部署YOLO,最近大概率会搜到“atlas 300v 24g”这个词。先说结论:没错,Atlas 300V 24G就是一张实打实的AI推理加速卡,而不是什么“显示卡”或者“计算卡”的变体。它归属昇腾310P系列,专门跑…

2026/9/25 17:30:43 阅读更多 →
LLM驱动的CLI代码审查:基于Git工作流的自动化code review新范式

LLM驱动的CLI代码审查:基于Git工作流的自动化code review新范式

1. 项目概述:这不是一个“工具”,而是一套可落地的代码审查新范式 “open-code-review”这个名称乍看像某个开源项目仓库名,但实际它代表的是一种正在快速演进的工程实践——把大语言模型(LLM)深度嵌入到开发者日常的…

2026/9/25 17:30:43 阅读更多 →
冲刺AER顶刊投稿前必查!AER投稿前预检(Preflight)技能清单:摘要、图表与披露一次过审

冲刺AER顶刊投稿前必查!AER投稿前预检(Preflight)技能清单:摘要、图表与披露一次过审

冲刺AER顶刊投稿前必查!AER投稿前预检(Preflight)技能清单:摘要、图表与披露一次过审 【免费下载链接】Auto-Empirical-Research-Skills 🔬 A curated collection of 23,000 agent skills for empirical research acro…

2026/9/25 17:29:43 阅读更多 →

最新新闻

Docker 常见仓库与镜像使用指南(2026 实战版)

Docker 常见仓库与镜像使用指南(2026 实战版)

前阵子带一个新人,让他用 Docker 起个 MySQL,他从某篇博客抄了条命令:docker run --name some-mysql --link some-app:app -d mysql跑不通,来问我。我一看就知道这教程是七八年前的——--link 这个参数 Docker 官方早就标记废弃了…

2026/9/25 18:47:28 阅读更多 →
如何写好 Skills:用 TaoToken 统一 Key 打通 Agent 与 CC 的配置骨架

如何写好 Skills:用 TaoToken 统一 Key 打通 Agent 与 CC 的配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 18:47:28 阅读更多 →
从粒子探测器到云数据库:三个“Atlas”背后的核心技术全景

从粒子探测器到云数据库:三个“Atlas”背后的核心技术全景

如果你最近经常刷到“atlas”这个词,你的第一反应可能和我一样:到底是哪家的产品?是那个会后空翻的机器人,还是某个大型云数据库,或者是粒子物理实验里的巨型探测器?答案是:都有可能。这也是“a…

2026/9/25 18:47:28 阅读更多 →
Hugging Face模型发布全指南:从本地训练到全球复用

Hugging Face模型发布全指南:从本地训练到全球复用

1. 这不是“上传”而是“发布一套可复现的模型资产” 你手头有个在本地跑通的 PyTorch 模型,可能是微调后的 BERT 分类器、自己搭的 ViT 图像分类器,或是用 LLaMA-Factory 训练出的小语言模型。现在你想让它被别人发现、下载、复用——不是发个 GitHub …

2026/9/25 18:46:28 阅读更多 →
沟通驱动型CRM:把客户沟通转化为可复用的客户资产

沟通驱动型CRM:把客户沟通转化为可复用的客户资产

做CRM这些年,我最大的感受是:大多数团队不是缺客户,而是缺"对客户关系的完整记忆"。销售手里攒了一堆微信聊天截图,客服在工单系统里反复问客户同一个问题,售后邮件散落在个人邮箱里,老板想看一眼…

2026/9/25 18:46:28 阅读更多 →
Go Workflow 引擎:从 Tempor 与 Cadence 到流程编排

Go Workflow 引擎:从 Tempor 与 Cadence 到流程编排

Go Workflow 引擎:从 Tempor 与 Cadence 到流程编排工作流引擎是后端组件的"粘合层"。Tempor / Cadence 是 Go 编写的开源流程编排引擎。本文讲清原理与集成。一、Temporal 是什么? Temporal 微服务编排 时间调度 容错。Google Uber 支持。…

2026/9/25 18:46:28 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →