ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

sinon sandbox.verify:批量校验沙箱内全部 Mock 期望值的权威指南

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),仅供参考
返回列表