sinon.match.func 匹配器指南:在 Sinon 中断言函数类型参数
sinon.match.func 匹配器指南在 Sinon 中断言函数类型参数【免费下载链接】sinonTest spies, stubs and mocks for JavaScript.项目地址: https://gitcode.com/gh_mirrors/si/sinonsinon.match.func是 Sinon 匹配器Matcher体系中用于校验参数是否为函数的专用匹配器它在 fake/spy/stub 的调用断言中扮演类型守卫角色让你无需关心具体函数实现只需确认这里被传入了一个可调用的函数。读完本文你将掌握sinon.match.func的完整用法、它与sinon.assert.calledWithMatch、spy.withArgs等 API 的组合方式以及它在当前 Sinon 仓库中的底层实现原理与边界行为。一、sinon.match.func是什么根据官方文档 func.md 的定义Requires the value to be aFunction.即要求被校验的值是一个函数Function。当被检查的参数满足该条件时匹配成功否则匹配失败。它是 Sinon 匹配器大家族中的一员。在 Matchers API 索引 中可以看到Sinon 提供了一整套面向不同数据类型的内置匹配器包括array、bool、date、number、object、regexp、string、symbol、typeOf等而func专门负责是否为函数这一类型判定。关于匹配器的整体使用背景可参考 Matchers 介绍匹配器可以被传给spy.calledOn、spy.calledWith、spy.returned及对应的sinon.assert系列函数以及spy.withArgs用于对期望值进行更模糊或更精确的匹配。二、基本用法配合断言 API 使用sinon.match.func最常见的用法是作为断言参数传入。它可与calledWithMatch、alwaysCalledWithMatch等断言 API 组合判断某个调用中指定位置的参数是一个函数。以仓库中的配套测试 func.test.js 为蓝本最直接的示例import * as sinon from sinon; const fake sinon.fake(); fake(function () {}); // 断言 fake 曾被调用且调用参数是一个函数 sinon.assert.calledWithMatch(fake, sinon.match.func);这段代码通过断言sinon.assert.calledWithMatch验证了fake至少被调用过一次且第一次调用传入的参数匹配sinon.match.func即是一个函数。若匹配失败断言会抛出包含expected fake to be called with match的错误信息——该信息模板定义在 assert.js 中mirrorPropAsAssertion( calledWithMatch, expected %n to be called with match %D, );三、完整行为验证接受与拒绝的边界配套测试 func.test.js 用 4 个用例完整刻画了sinon.match.func的判定边界这是最权威的行为证据3.1 接受普通函数声明fake(function () {}); t.doesNotThrow(() { sinon.assert.calledWithMatch(fake, sinon.match.func); }, should accept function);普通函数声明function declaration / 函数表达式通过校验。3.2 接受箭头函数fake(() {}); t.doesNotThrow(() { sinon.assert.calledWithMatch(fake, sinon.match.func); }, should accept arrow function);箭头函数arrow function同样通过校验。由于sinon.match.func的判定基于 JavaScript 的函数类型语义可以推断只要typeof value function的值都会被接受因此async function、generator 函数、classtypeof 亦为function等可调用/可实例化实体在语义上也应能通过匹配。3.3 拒绝带 call 方法的普通对象fake({ call: () {} }); t.throws( () sinon.assert.calledWithMatch(fake, sinon.match.func), /expected fake to be called with match/, should reject object );一个拥有call属性的普通对象不会被误判为函数。这一点非常重要——sinon.match.func校验的是真实的函数类型而非长得像函数的对象。例如{ call: () {} }这类模拟可调用形态的对象会被明确拒绝。这也意味着它比sinon.match.has(call, sinon.match.func)这类针对属性做匹配的方式语义更严格、更直接。3.4 拒绝字符串等非函数值fake(function); t.throws( () sinon.assert.calledWithMatch(fake, sinon.match.func), /expected fake to be called with match/, should reject string );即使是内容为function的字符串也不会通过匹配——匹配器关注的是值的运行时类型而不是字面内容。3.5 行为小结传入值匹配结果依据function () {}✅ 通过测试用例 should accept function() {}✅ 通过测试用例 should accept arrow function{ call: () {} }❌ 拒绝测试用例 should reject objectfunction字符串❌ 拒绝测试用例 should reject string四、更多使用场景4.1 用于 spy 的calledWithMatchsinon.match.func不只适用于 fake也可直接用于 spy 的调用记录查询const spy sinon.spy(); spy(() {}); spy.calledWithMatch(sinon.match.func); // true相关 API 说明可参考 called-with-match.md。4.2 与alwaysCalledWithMatch组合当需要断言每一次调用都传入函数时使用alwaysCalledWithMatchconst spy sinon.spy(); spy(() {}); spy(() {}); sinon.assert.alwaysCalledWithMatch(spy, sinon.match.func);4.3 用于withArgs条件化 stub/fakesinon.match.func还可以配合spy.withArgs/stub.withArgs使用实现当参数是函数时走特定行为的条件逻辑const stub sinon.stub(); stub.withArgs(sinon.match.func).returns(got a function); stub.withArgs(sinon.match.number).returns(got a number); stub(() {}); // got a function stub(42); // got a number4.4 用于 mock 的 expectation在 mock 的expects()期望中同样可以用匹配器约束参数类型const mock sinon.mock(obj); mock.expects(method).withArgs(sinon.match.func);相关文档可参考 expectations.md。五、与sinon.match.typeOf(function)的关系Sinon 还提供更通用的类型匹配器sinon.match.typeOf(type)见 type-of.md。它支持的 type 列表包含undefined、null、boolean、number、string、object、function、array、regexp、date、symbol。因此以下两种写法在语义上等价sinon.match.func sinon.match.typeOf(function)选择建议sinon.match.func写法更简洁、意图更聚焦sinon.match.typeOf(function)则在你需要统一管理多种类型断言、或在配置化场景下动态传入类型字符串时更有优势。六、底层实现原理委托给 sinonjs/samsam从源码看sinon.match并非在 Sinon 内部自行实现而是委托给sinonjs/samsam包。在 create-sinon-api.js 中可以看到 API 组装的关键一行import samsam from sinonjs/samsam; // ... match: samsam.createMatcher,即sinon.match直接指向samsam.createMatcher该依赖声明于 package.json 的sinonjs/samsam: ^10.0.2而sinon.match.func正是createMatcher返回的匹配器对象上提供的具名匹配器之一。匹配器在调用链中的消费方式也清晰可见在 assert.js 中sinon.assert.match(actual, expectation)通过createMatcher(expectation)创建匹配器并调用matcher.test(actual)完成校验在 proxy-call.js 中calledWithMatch对每个期望参数执行match(expectation).test(actual)逐一比对实际调用参数在 spy-formatters.js 中匹配器对象还参与断言失败时的消息格式化通过matcher.message与matcher.test决定如何高亮展示失配参数。由此可以理解sinon.match.func的完整工作路径sinon.match.func是一个带test(value)方法的匹配器对象 → 断言 API 将其与真实参数逐位比对 → 匹配失败时抛出格式化错误消息。这也是所有内置匹配器any、string、number等共享的统一机制。七、常见误区与注意事项不要用含 call 方法的对象冒充函数如测试所示{ call: () {} }会被拒绝。sinon.match.func判定的是真实类型而非形态。它是类型匹配不是内容匹配传入字符串function无法通过如需校验函数名叫什么或函数体内容应改用自定义匹配器参见 custom-matchers.md或callsFake等行为 API。配合calledWithMatch系列而非calledWithcalledWith使用深度相等deepEqual比对而calledWithMatch才会对参数逐个应用匹配器。要发挥sinon.match.func的作用必须走calledWithMatch/alwaysCalledWithMatch或对应的sinon.assert.*系列断言。匹配器可嵌套sinon.match.func也可以嵌套在其他匹配器中例如sinon.match({ handler: sinon.match.func })用于校验对象中某个属性的类型。八、小结sinon.match.func虽小却是 Sinon 测试体系中函数类型参数断言的标准答案判定规则要求被校验的值是函数typeof value function语义下的可调用实体行为证据仓库配套测试 func.test.js 明确验证了普通函数与箭头函数通过、对象与字符串被拒绝实现原理经由 create-sinon-api.js 委托给sinonjs/samsam的createMatcher并通过 assert.js 与 proxy-call.js 中的test()调用完成比对使用姿势与calledWithMatch、alwaysCalledWithMatch、withArgs、mock expectation 组合即可在回调类、事件处理类、依赖注入类场景中精确断言这里传进来的是一个函数。在编写涉及回调、监听器、middleware、策略函数等大量函数型参数的测试时sinon.match.func能让断言意图一目了然是值得纳入日常测试工具箱的轻量利器。【免费下载链接】sinonTest spies, stubs and mocks for JavaScript.项目地址: https://gitcode.com/gh_mirrors/si/sinon创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

wp-calypso 图片预加载组件 ImagePreloader:实现占位符过渡与加载状态管理

wp-calypso 图片预加载组件 ImagePreloader:实现占位符过渡与加载状态管理

前端CMS 【免费下载链接】wp-calypso The JavaScript and API powered WordPress.com 项目地址: https://gitcode.com/gh_mirrors/wp/wp-calypso 点击查看 免费下载 导读 ImagePreloader 是 wp-calypso(WordPress.com 的前端单页应用)内置的…

2026/9/24 16:04:13 阅读更多 →
基于 task-provider-sample 深入解析 VS Code Task Provider API:从 Rakefile 自动检测到自定义构建任务

基于 task-provider-sample 深入解析 VS Code Task Provider API:从 Rakefile 自动检测到自定义构建任务

示例工程 【免费下载链接】vscode-extension-samples Sample code illustrating the VS Code extension API. 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-extension-samples 点击查看 免费下载 导读 本篇文章以 vscode-extension-samples 仓库中的 task…

2026/9/24 16:04:13 阅读更多 →
应用案例 | 船舶海洋:基于MBSE 的船舶系统电磁兼容性设计专用软件开发

应用案例 | 船舶海洋:基于MBSE 的船舶系统电磁兼容性设计专用软件开发

一、项目背景随着船舶系统复杂度的不断提升,舰载电子设备的数量持续增加,系统间的电磁耦合关系也日益变得复杂,传统的基于文档的电磁兼容性设计方式已暴露出流程衔接性差、协同作业效率低、知识复用度不足等问题。以基于模型的系统工程&#…

2026/9/24 16:03:10 阅读更多 →

最新新闻

如何快速接入支付宝支付?alipay_sdk_cj仓颉原生SDK完全指南

如何快速接入支付宝支付?alipay_sdk_cj仓颉原生SDK完全指南

如何快速接入支付宝支付?alipay_sdk_cj仓颉原生SDK完全指南 【免费下载链接】alipay_sdk_cj AliPay Sdk for 仓颉 支付宝接口后端sdk,方便cangjie开发者快速接入支付宝的支付接口(目前只支持最广泛使用的商户直接接入模式,只支持最…

2026/9/24 16:36:43 阅读更多 →
Spring注解--@Async异步执行的方法

Spring注解--@Async异步执行的方法

原文网址:Spring注解--Async异步执行的方法-CSDN博客 简介 本文介绍Spring的Async的用法。Async是用来异步执行任务的。 基础代码 正常情况下,执行两个任务是这样的: Controller package com.knife.example.controller;import io.swagg…

2026/9/24 16:36:43 阅读更多 →
幂等,kafka,mysql,kafka,redis,linux,bean声明周期,spring启动,AQS,位运算模运算,sql取每个班级的前3名,各种文件流,nginx, aop,分库分表

幂等,kafka,mysql,kafka,redis,linux,bean声明周期,spring启动,AQS,位运算模运算,sql取每个班级的前3名,各种文件流,nginx, aop,分库分表

1,幂等 幂等在接口、消息队列 和防抖中都有见到,所以也是经常被问到的 最长用、也是最通用的方法就是给消息加个唯一标识,然后在消费端 加上业务判断,到缓存或者数据库中查询是否已经存在这个标识,存在说明已经消费过了,就跳过。否则就消费,并保存到缓存或数据库中。…

2026/9/24 16:36:43 阅读更多 →
16-U-Boot环境变量系统

16-U-Boot环境变量系统

文章目录 一、概述 二、形象比喻:办公室的白板和档案柜 三、环境变量工作流程 四、核心环境变量详解 4.1 启动控制类 4.2 内核加载地址类 4.3 bootargs -- 内核命令行参数 4.4 网络配置类 4.5 分区和启动路径类 五、环境变量操作命令 六、环境变量存储机制 6.1 RK3506 的存储配…

2026/9/24 16:36:43 阅读更多 →
Open-Meteo 免费天气预報 API:无需 API 密钥获取 16 天逐小时预报

Open-Meteo 免费天气预報 API:无需 API 密钥获取 16 天逐小时预报

Open-Meteo 免费天气预報 API:无需 API 密钥获取 16 天逐小时预报 【免费下载链接】open-meteo Free Weather Forecast API for non-commercial use 项目地址: https://gitcode.com/GitHub_Trending/op/open-meteo 给应用加一个天气页面,或者做研…

2026/9/24 16:36:43 阅读更多 →
AI Agent 脚手架系统架构设计:基于 Spring AI + Google ADK 的三层架构与技术选型实践

AI Agent 脚手架系统架构设计:基于 Spring AI + Google ADK 的三层架构与技术选型实践

文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、…

2026/9/24 16:35:42 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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 阅读更多 →