enzyme ShallowWrapper 的 `.not(selector)` 方法:按选择器反向过滤节点的完整指南
测试前端【免费下载链接】enzymeJavaScript Testing utilities for React项目地址https://gitcode.com/gh_mirrors/en/enzyme点击查看免费下载.not(selector)是 enzyme 为ShallowWrapper提供的反向过滤 API它返回一个新的 wrapper只包含当前 wrapper 中不匹配指定选择器的节点。它常与.find()链式配合使用用于排除符合某条件的一批节点也可以单独在任意 wrapper 上对现有节点做筛选。本文以官方 API 文档为基础结合仓库源码与共享测试用例讲解其签名、行为、支持的选择器类型、底层实现原理及常见坑位帮助你准确掌握这个过滤的取反工具。API 签名与语义官方文档给出的签名与描述如下.not(selector) ShallowWrapperReturns a new wrapper with only the nodes of the current wrapper that dont match the provided selector.即返回一个新 wrapper仅包含当前 wrapper 中不匹配所给选择器的节点。文档明确说明This method is effectively the negation or inverse offilter.也就是说对同一组节点分别调用filter(selector)与not(selector)二者取到的节点集合互为补集前提是节点总数确定。参数与返回值项目说明参数selectorEnzymeSelector要匹配的选择器返回值ShallowWrapper包装了过滤后节点的新 wrapper其中EnzymeSelector支持四种形式详见 docs/api/selector.mdCSS 选择器子集类名.foo、标签名div、id#foo、属性[hreffoo]、通配*以及 React 组件名与 props 组合如Button[typesubmit]React 组件构造函数直接传入组件引用只按组件类型判断忽略 props 与 children组件的 displayName 字符串仅当字符串以大写字母开头时才按 displayName 匹配小写开头的字符串会被当作 CSS 标签名对象属性选择器如{ foo: 3 }按 props 子集匹配属性值不允许为undefined否则抛出TypeError。官方示例文档示例展示了not与find链式使用的典型场景const wrapper shallow(MyComponent /); expect(wrapper.find(.foo).not(.bar)).to.have.lengthOf(1);含义是先find(.foo)取出所有带foo类的节点再用.not(.bar)排除其中带bar类的节点最终断言剩下的节点数为 1。结合源码理解实现not是如何工作的not的实现在 packages/enzyme/src/ShallowWrapper.js/** * Returns a new wrapper instance with only the nodes of the current wrapper that did not match * the provided selector. Essentially the inverse of filter. * * param {EnzymeSelector} selector * returns {ShallowWrapper} */ not(selector) { const predicate buildPredicate(selector); return filterWhereUnwrapped(this, (n) !predicate(n)); }实现路径非常清晰buildPredicate(selector)把选择器编译成一个单节点匹配判定函数predicate(n)见 packages/enzyme/src/selectors.js。它对字符串选择器走 CSS token 解析分支对函数/组件构造函数走元素类型匹配分支对非空对象走 props 匹配分支并分别抛出相应TypeError如 props 含undefined、空对象、数组、null。取反用(n) !predicate(n)对判定结果取反这正是not与filter的唯一差异。对比filter的实现同文件 L1065-L1068它传的是predicate本身而not传的是取反后的函数。filterWhereUnwrapped对内部节点数组执行过滤并重新包装见 packages/enzyme/src/ShallowWrapper.jsfunction filterWhereUnwrapped(wrapper, predicate) { return wrapper.wrap(wrapper.getNodesInternal().filter(predicate).filter(Boolean)); }getNodesInternal()取当前 wrapper 的所有节点filter(predicate)保留通过判定的节点随后filter(Boolean)剔除空值最后wrap生成新的ShallowWrapper返回。因此not返回的始终是一个新 wrapper不会修改原 wrapper。值得注意的是同名方法也存在于ReactWrapper上见 packages/enzyme/src/ReactWrapper.js实现逻辑与浅渲染版本完全一致因此本文讨论的语义与注意事项同样适用于完整挂载场景。一个重要限制不支持复杂 CSS 选择器从buildPredicate的字符串分支可以看到selectors.js当选择器包含组合器如空格后代、、、~时会被判定为复杂选择器并直接抛出if (isComplexSelector(tokens)) { throw new TypeError(This method does not support complex CSS selectors); }也就是说.not(.foo .bar)这类带层级组合的写法会直接报错应改用.findWhere()配合自定义谓词实现等价过滤。实战示例多种选择器形式下的反向过滤仓库的共享测试 packages/enzyme-test-suite/test/shared/methods/not.jsx 给出了可运行、可验证的完整用例const wrapper Wrap(( div div classNamefoo bar baz / div classNamefoo / div classNamebar baz / div classNamebaz / div classNamefoo bar / /div )); expect(wrapper.find(.foo).not(.bar)).to.have.lengthOf(1); expect(wrapper.find(.baz).not(.foo)).to.have.lengthOf(2); expect(wrapper.find(.foo).not(div)).to.have.lengthOf(0);逐条拆解find(.foo)得到 3 个节点foo bar baz、foo、foo bar.not(.bar)排除带bar的 2 个剩 1 个find(.baz)得到 3 个节点foo bar baz、bar baz、baz.not(.foo)排除带foo的 1 个剩 2 个find(.foo)的 3 个节点都是div.not(div)按标签名全部排除剩 0 个——这验证了.not同样支持标签名选择器。除 CSS 选择器外.not也接受其他EnzymeSelector形式例如// 按组件构造函数排除 expect(wrapper.find(MyComponent).not(OtherComponent)).to.have.lengthOf(2); // 按 displayName 排除字符串需以大写字母开头 expect(wrapper.find(MyComponent).not(OtherComponent)).to.have.lengthOf(2); // 按 props 对象排除 expect(wrapper.find(span).not({ type: text })).to.have.lengthOf(3); // 对象属性值不能为 undefined否则抛 TypeError wrapper.find(span).not({ foo: 3, bar: undefined }); // TypeError需要搜索属性值是否为 undefined这种场景时请改用.findWhere()对象属性选择器对此会直接抛错参见 docs/api/selector.md 的 Undefined Properties 一节。与相关方法的辨析文档末尾给出了两个相关方法.filterWhere(predicate) ShallowWrapper接受一个ShallowWrapper Boolean的谓词函数而非选择器适用于无法用选择器表达的复杂判定例如类型不是字符串的复合组件.filter(selector) ShallowWrapper语义上与not完全互逆filter保留匹配节点not保留不匹配节点。三者的取舍建议需求推荐方法排除匹配某选择器的节点.not(selector)保留匹配某选择器的节点.filter(selector)按自定义函数条件过滤.filterWhere(fn)配合!fn亦可实现取反由于not的底层判定仍然来自buildPredicate它与.find()、.filter()、.is()、.some()、.every()等方法共享同一套选择器解析逻辑掌握 docs/api/selector.md 中列出的选择器规则就能在所有接受EnzymeSelector的 API 间无缝迁移。小结.not(selector)是 enzyme 浅渲染测试中做排除式筛选的标准工具它基于buildPredicate编译选择器、对判定结果取反再通过filterWhereUnwrapped返回一个新 wrapper实现上非常轻量。使用时注意三点选择器不支持复杂 CSS 组合写法会抛TypeError对象选择器属性值不可为undefined返回的新 wrapper 与原 wrapper 相互独立可安全链式断言。赞分享测试前端【免费下载链接】enzymeJavaScript Testing utilities for React项目地址https://gitcode.com/gh_mirrors/en/enzyme点击查看免费下载相关推荐enzyme .filter(selector) 方法详解在 ShallowWrapper 中按选择器精确筛选节点enzyme .filter selector 方法详解在 ShallowWrapper 中按选择器精确筛选节点 .filter selector 是 enz测试前端enzyme 中 .not(selector) 方法详解如何过滤出所有不匹配选择器的节点enzyme 中 .not selector 方法详解如何过滤出所有不匹配选择器的节点 导读 .not selector 是 enzyme 为 ReactWr测试前端enzyme ReactWrapper.filter(selector) 完全指南按选择器精确筛选渲染树节点enzyme ReactWrapper.filter selector 完全指南按选择器精确筛选渲染树节点 导读 .filter selector 是 enz测试前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

多传感器时滞系统的协方差交叉融合:原理与Matlab实现

多传感器时滞系统的协方差交叉融合:原理与Matlab实现

时滞系统的协方差交叉融合估计:从原理到Matlab实现的完整复盘做多传感器信息融合的人,早晚都会撞上同一个尴尬:理论上漂亮的最优融合公式,一用到实际系统里就“水土不服”。尤其是系统还带时滞的时候——传感器测量到的已经是几十…

2026/9/21 2:14:11 阅读更多 →
程序员薪资分析系统设计与实现:从数据采集到可视化大屏全链路解析

程序员薪资分析系统设计与实现:从数据采集到可视化大屏全链路解析

先说说我为什么推荐这个选题。程序员薪资分析系统,是这几年计算机/大数据方向毕设里少见的“性价比”很高的题目——它同时踩中了几个关键点:有明确的数据采集场景(爬虫)、有完整的数据处理链路(清洗—存储—分析&…

2026/9/21 2:13:11 阅读更多 →
ChatGPT Plus降智检测三法:指令遵循、响应熵值与上下文稳定性

ChatGPT Plus降智检测三法:指令遵循、响应熵值与上下文稳定性

1. “降智”不是玄学,是模型响应质量的可量化退化现象最近好几条私信问我:“我的ChatGPT Plus账号是不是被降智了?”——语气里带着困惑、焦虑,甚至一点被辜负的委屈。这词儿听着像网络段子,但背后反映的是真实体验断崖…

2026/9/21 2:13:11 阅读更多 →

最新新闻

react-admin 实时订阅实战:深入掌握 `useSubscribeToRecord` 单记录事件订阅 Hook

react-admin 实时订阅实战:深入掌握 `useSubscribeToRecord` 单记录事件订阅 Hook

react-admin 实时订阅实战:深入掌握 useSubscribeToRecord 单记录事件订阅 Hook 【免费下载链接】react-admin A frontend Framework for single-page applications on top of REST/GraphQL APIs, using TypeScript, React and Material Design 项目地址: https:/…

2026/9/21 3:27:56 阅读更多 →
在 Vue 3 应用中接入 json-render DevTools:@json-render/devtools-vue 完整接入与源码解析

在 Vue 3 应用中接入 json-render DevTools:@json-render/devtools-vue 完整接入与源码解析

在 Vue 3 应用中接入 json-render DevTools:json-render/devtools-vue 完整接入与源码解析 【免费下载链接】json-render The Generative UI framework 项目地址: https://gitcode.com/GitHub_Trending/js/json-render json-render/devtools-vue 是 json-ren…

2026/9/21 3:27:56 阅读更多 →
Etherpad 自更新子系统 Tier 3 深度解析:带宽限窗口的自动升级(Auto-Update with Grace Window)

Etherpad 自更新子系统 Tier 3 深度解析:带宽限窗口的自动升级(Auto-Update with Grace Window)

后端协同办公WebSocket前端富文本 【免费下载链接】etherpad Etherpad: A modern really-real-time collaborative document editor. 项目地址: https://gitcode.com/gh_mirrors/et/etherpad 点击查看 免费下载 Etherpad 内置的"自更新子系统"&#xff0…

2026/9/21 3:27:55 阅读更多 →
lark-cli apps +plugin-list 命令完全指南:妙搭应用插件声明与安装状态核验

lark-cli apps +plugin-list 命令完全指南:妙搭应用插件声明与安装状态核验

CLIAI 技能 【免费下载链接】cli The official Lark/飞书 CLI tool, maintained by the larksuite team — built for humans and AI Agents. Covers core business domains including Messenger, Docs, Base, Sheets, Calendar, Mail, Tasks, Meetings, and more, with 200 co…

2026/9/21 3:27:55 阅读更多 →
Gradle 属性命名规范 ADR-0010:org.gradle 前缀体系下的 public/internal 与特性稳定性契约

Gradle 属性命名规范 ADR-0010:org.gradle 前缀体系下的 public/internal 与特性稳定性契约

构建工具开发工具 【免费下载链接】gradle Adaptable, fast automation for all 项目地址: https://gitcode.com/gh_mirrors/gr/gradle 点击查看 免费下载 本文是 Gradle 仓库 architecture/standards/0010-gradle-properties-naming.md 这份架构决策记录&#xff…

2026/9/21 3:27:55 阅读更多 →
V8 字符串表示体系详解:从 SeqString 到 ConsString 的内部表示、internalization 与 String Table

V8 字符串表示体系详解:从 SeqString 到 ConsString 的内部表示、internalization 与 String Table

语言运行时编译器JIT编译解释器内存管理 【免费下载链接】v8 The official mirror of the V8 Git repository 项目地址: https://gitcode.com/gh_mirrors/v81/v8 点击查看 免费下载 导读 JavaScript 中的字符串是最基础的数据类型,V8 并没有使用单一的…

2026/9/21 3:26:55 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/9/20 0:00:46 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/19 23:35:34 阅读更多 →