用 React Testing Library 如何模拟表单输入并断言受控组件的值与校验提示
围绕“用 React Testing Library 如何模拟表单输入并断言受控组件的值与校验提示”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 userEvent.type/clear 触发受控 onChange 及校验文案的异步断言。
程序员面试题库第 87 页,收录第 4301–4350 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
围绕“用 React Testing Library 如何模拟表单输入并断言受控组件的值与校验提示”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 userEvent.type/clear 触发受控 onChange 及校验文案的异步断言。
围绕“Testing Library 查询默认为何查不到 display:none 的元素,如何用 hidden 选项改变”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确默认按可访问性过滤隐藏元素及 byRole 的 hidden:true 例外用法。
围绕“Testing Library 中 getAllBy 返回数组后如何对列表内容做稳定断言”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确用 getAllByRole 结合文本内容断言数量与条目、避免依赖 DOM 顺序以外的脆弱选择。
围绕“Testing Library 查询方法的优先级顺序是什么,为什么 getByRole 应优先于 getByTest”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确按可访问性贴近用户程度的优先级排序理由。
围绕“用 React Testing Library 测试依赖路由参数的组件时如何注入路由上下文与初始路径”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 MemoryRouter initialEntries 提供路径与参数、不依赖浏览器 history 的做法。
围绕“Testing Library 的 getByRole 如何通过可访问名称区分同名按钮,name 选项依据什么计算”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确可访问名称由 aria-label、关联 label、文本内容按规范计算并可用 name 过滤。
围绕“Testing Library 中为什么推荐用 screen 查询而不是解构 render 的返回值”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 screen 避免 container 引用过期、减少 render 返回项扩散的理由。
围绕“Testing Library 文本匹配中字符串、正则、函数三种 matcher 的匹配行为差异与大小写处理”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确默认整串精确匹配、正则部分匹配、函数自定义谓词的差异及 exact 参数作用。
围绕“React Testing Library 中 userEvent 与 fireEvent 的区别是什么,为什么官方”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 userEvent 模拟完整用户交互序列(hover、focus、逐字符输入)而 fireEvent 只派发单个事件。
围绕“Testing Library 的 waitFor 何时使用,它与 findBy 查询的重试机制有什么重叠与分工”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确对非查询类断言的轮询重试用 waitFor、查找元素用 findBy 的分工。
围绕“Testing Library 的 within 在什么场景比全局 screen 查询更可靠”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确将查询限定在某个容器子树内以避免重复元素冲突的场景与写法。
围绕“Vitest 中 jsdom 与 happy-dom 环境的选择依据是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确 jsdom 兼容性更全、happy-dom 更快的取舍及切换配置方式。
围绕“设计属性测试的输入生成器时,如何让空值、极值、Unicode 等边界数据被充分采到”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答生成器覆盖边界分布的方法。
围绕“断言 mock「被调用过」和「以特定参数调用」的说服力差异在哪,为什么参数断言更防回归”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答交互契约的精确验证价值。
围绕“自定义断言失败消息应该包含哪些信息才能让失败输出直接定位问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答期望值/实际值/上下文的呈现原则。
围绕“单元测试里断言失败和普通代码抛异常有什么区别,为什么不能用 try-catch 代替断言”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答断言库如何标记失败并聚合多个断言结果。
围绕“expect.any、expect.objectContaining 这类非对称匹配器何时该用,滥用会掩盖什么回归”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答对不稳定字段放宽、对关键字段收紧的平衡。
围绕“beforeEach 和 beforeAll 建立测试环境时该如何选择,什么情况下 beforeAll 会破坏隔离”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答每次重建与一次共享的成本/隔离权衡。
围绕“为什么 afterEach 中清理比在被测代码里清理更可靠,清理遗漏会造成什么后果”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答失败路径下仍执行清理的保证与跨用例污染。
围绕“消费者驱动契约测试解决的是 mock 与真实服务之间什么具体的漂移问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答以契约文件校验双方期望、防止 mock 说谎的机制。
围绕“契约测试能否替代跨服务的集成测试,两者各自覆盖不了的失败类型是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答 schema/语义校验与真实运行时行为(认证、数据状态)的边界。
围绕“契约测试中生产者端和消费者端各自验证什么,为什么只在一端验证不够”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答请求符合约定与响应满足期望两个方向的互补。
围绕“测试一个防抖输入框时用 fake timer 应验证哪几个时间点(未到间隔、恰好到间隔、连续触发)”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答围绕时间窗边界的用例设计,不复述防抖实现原理。
围绕“为什么测试数据要用固定种子或显式构造而不是 Math.random,随机数据带来的不可重复失败如何诊断”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答可重复性对二分定位与 CI 稳定性的意义。
围绕“Vitest 中 expect.assertions() 和 expect.hasAssertions() 在异步测”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖区分强制断言数量与至少一次断言两类防护。
围绕“fake timer 开启后为什么有些测试会假死(例如等待真实请求超时),如何避免”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答被替换时钟影响第三方库超时逻辑的诊断与 shouldAdvanceTime 选项。
围绕“fake timer 下异步代码卡在 await 上时,runAllTimersAsync 与 advanceTim”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答定时器与微任务交错时的推进语义差异。
围绕“Vitest 的 vi.useFakeTimers() 如何跳过 setTimeout 等待,为什么必须配合 adv”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答替换时钟源后时间不再真实流逝的机制。
围绕“vi.setSystemTime() 固定当前时间对测试 Date.now 依赖的代码(如过期判断)有什么价值,与时”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答逻辑时钟固定的确定性收益。
围绕“数据库类夹具选择「每用例全新数据」还是「共享只读基线数据」,各自适合什么测试目标”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答写操作测试需隔离、只读查询可共享的取舍。
围绕“测试夹具(fixture)应该把环境搭建放在哪一层(每用例、每文件、全局),判断依据是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答搭建成本与隔离需求决定夹具生命周期层级。
围绕“Playwright 的 web-first 断言(如 toBeVisible)为什么会自动重试,这与普通 expe”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答轮询重试消除 UI 时序竞态的机制。
围绕“对 CI 上的不稳定(flaky)测试,重试机制、隔离与修复三种处理策略该如何排优先级”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答重试只是止血、必须追根因的优先级判断。
围绕“需要模拟依赖第一次失败、第二次成功来测试重试逻辑时,mock 应如何表达调用序列并断言调用次数”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答 once 链与 toHaveBeenCalledTimes 的组合用法。
围绕“mock、stub、spy 三者在验证行为上的分工差异是什么,什么场景必须验证交互而非状态”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答行为验证与状态验证的分界。
围绕“过度 mock 为什么会让测试在重构后大面积误报,判断该不该 mock 一条依赖的标准是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答按可变性/外部性划依赖边界的标准。
围绕“Vitest 并行执行测试文件时靠什么隔离模块状态,什么全局副作用仍会泄漏”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答 worker 进程/线程隔离边界与文件系统、端口等共享资源风险。
围绕“如何用 vi.importActual 只替换模块的一个导出而保留其余真实实现,这种做法的风险是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答部分 mock 的写法与真实实现漂移风险。
围绕“属性测试与示例测试的根本差异是什么,为什么「反序两次等于原数组」比固定用例更有覆盖力”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答以不变量代替枚举输入的思维转换。
围绕“为排序函数写属性测试时,除了「结果有序」还应断言哪些不变量(长度守恒、多重集守恒)”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答多个互补不变量共同约束实现正确性。
围绕“单元测试为什么不应该发真实网络请求,违反后除了慢还有什么正确性风险”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答外部不确定性导致的不可重复与误报。
围绕“属性测试发现失败用例后的 shrink(收缩)过程在做什么,为什么它对定位根因至关重要”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答自动最小化反例的机制与诊断价值。
围绕“什么时候该用软断言(soft assertions)让一个用例报告多个失败,代价是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答聚合失败与失败即停之间的诊断价值权衡。
围绕“vi.spyOn 监视对象方法后为什么必须在测试间恢复,不恢复会引发什么跨用例污染”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答原型/实例方法被替换后的泄漏路径与 restoreMocks 配置。
围绕“为什么单元测试之间必须相互独立,共享可变状态会导致哪些难以诊断的失败模式”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答执行顺序耦合与隐式依赖的诊断难题。
围绕“发现一个测试单独运行通过、整套运行时失败,应按什么思路诊断顺序依赖”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答二分定位与状态残留排查方法。
围绕“除了时间与时区,还有哪些环境因素(语言环境、区域格式、文件系统大小写)会让同一测试在不同机器结果不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答枚举隐式环境依赖并显式固定的方法。
围绕“「测行为不测实现」原则下,哪些断言(调用内部私有方法、检查内部状态)属于脆弱的实现耦合”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答以可观察输出为断言目标的标准。
围绕“Testing Library 的 waitFor 与 findBy 查询都带等待,两者适用场景与超时失败信息有何不”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答任意条件轮询与元素出现等待的分工及失败可读性。
围绕“Vitest 的 toBe、toEqual、toStrictEqual 在比较对象和类实例时行为差异是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答引用相等、递归相等与严格类型比较三档语义。