用 React Testing Library 如何模拟表单输入并断言受控组件的值与校验提示
用 React Testing Library 如何模拟表单输入并断言受控组件的值与校验提示 本文先给出可直接复述的结论,再用最小代码说明React Testing Library 表单输入 校验 测试的工作方式、判断依据、项目边界和常见误区。
程序员面试题库第 87 页,收录第 4301–4350 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
用 React Testing Library 如何模拟表单输入并断言受控组件的值与校验提示 本文先给出可直接复述的结论,再用最小代码说明React Testing Library 表单输入 校验 测试的工作方式、判断依据、项目边界和常见误区。
Testing Library 查询默认为何查不到 display:none 的元素,如何用 hidden 选项改变行为 本文先给出可直接复述的结论,再用最小代码说明Testing Library hidden 元素 查询不到的工作方式、判断依据、项目边界和常见误区。
Testing Library 中 getAllBy 返回数组后如何对列表内容做稳定断言 本文先给出可直接复述的结论,再用最小代码说明Testing Library getAllBy 列表断言 within的工作方式、判断依据、项目边界和常见误区。
Testing Library 查询方法的优先级顺序是什么,为什么 getByRole 应优先于 getByTestId 本文先给出可直接复述的结论,再用最小代码说明Testing Library 查询优先级 getByRole的工作方式、判断依据、项目边界和常见误区。
用 React Testing Library 测试依赖路由参数的组件时如何注入路由上下文与初始路径 本文先给出可直接复述的结论,再用最小代码说明React Testing Library MemoryRouter 路由测试的工作方式、判断依据、项目边界和常见误区。
Testing Library 的 getByRole 如何通过可访问名称区分同名按钮,name 选项依据什么计算 本文先给出可直接复述的结论,再用最小代码说明Testing Library getByRole name 可访问名称的工作方式、判断依据、项目边界和常见误区。
Testing Library 中为什么推荐用 screen 查询而不是解构 render 的返回值 本文先给出可直接复述的结论,再用最小代码说明Testing Library screen render 解构 推荐的工作方式、判断依据、项目边界和常见误区。
Testing Library 文本匹配中字符串、正则、函数三种 matcher 的匹配行为差异与大小写处理 本文先给出可直接复述的结论,再用最小代码说明Testing Library TextMatch 正则 函数 matcher的工作方式、判断依据、项目边界和常见误区。
React Testing Library 中 userEvent 与 fireEvent 的区别是什么,为什么官方推荐 userEvent 本文先给出可直接复述的结论,再用最小代码说明Testing Library userEvent fireEvent 区别的工作方式、判断依据、项目边界和常见误区。
Testing Library 的 waitFor 何时使用,它与 findBy 查询的重试机制有什么重叠与分工 本文先给出可直接复述的结论,再用最小代码说明Testing Library waitFor findBy 异步断言的工作方式、判断依据、项目边界和常见误区。
Testing Library 的 within 在什么场景比全局 screen 查询更可靠 本文先给出可直接复述的结论,再用最小代码说明Testing Library within 局部查询的工作方式、判断依据、项目边界和常见误区。
Vitest 中 jsdom 与 happy-dom 环境的选择依据是什么 本文先给出可直接复述的结论,再用最小代码说明Vitest jsdom happy-dom 环境 选择的工作方式、判断依据、项目边界和常见误区。
设计属性测试的输入生成器时,如何让空值、极值、Unicode 等边界数据被充分采到? 本文先给出可直接复述的结论,再用最小代码说明fast-check arbitrary 边界生成的工作方式、判断依据、项目边界和常见误区。
断言 mock「被调用过」和「以特定参数调用」的说服力差异在哪,为什么参数断言更防回归? 本文先给出可直接复述的结论,再用最小代码说明toHaveBeenCalledWith 参数断言的工作方式、判断依据、项目边界和常见误区。
自定义断言失败消息应该包含哪些信息才能让失败输出直接定位问题? 本文先给出可直接复述的结论,再用最小代码说明断言失败消息 可读性 设计的工作方式、判断依据、项目边界和常见误区。
单元测试里断言失败和普通代码抛异常有什么区别,为什么不能用 try-catch 代替断言? 本文先给出可直接复述的结论,再用最小代码说明断言失败 异常 单元测试的工作方式、判断依据、项目边界和常见误区。
expect.any、expect.objectContaining 这类非对称匹配器何时该用,滥用会掩盖什么回归? 本文先给出可直接复述的结论,再用最小代码说明expect.objectContaining 非对称匹配器的工作方式、判断依据、项目边界和常见误区。
beforeEach 和 beforeAll 建立测试环境时该如何选择,什么情况下 beforeAll 会破坏隔离? 本文先给出可直接复述的结论,再用最小代码说明beforeEach beforeAll 区别 测试隔离的工作方式、判断依据、项目边界和常见误区。
为什么 afterEach 中清理比在被测代码里清理更可靠,清理遗漏会造成什么后果? 本文先给出可直接复述的结论,再用最小代码说明afterEach 清理 测试污染的工作方式、判断依据、项目边界和常见误区。
消费者驱动契约测试解决的是 mock 与真实服务之间什么具体的漂移问题? 本文先给出可直接复述的结论,再用最小代码说明消费者驱动契约测试 mock 漂移的工作方式、判断依据、项目边界和常见误区。
契约测试能否替代跨服务的集成测试,两者各自覆盖不了的失败类型是什么? 本文先给出可直接复述的结论,再用最小代码说明契约测试 集成测试 区别的工作方式、判断依据、项目边界和常见误区。
契约测试中生产者端和消费者端各自验证什么,为什么只在一端验证不够? 本文先给出可直接复述的结论,再用最小代码说明契约测试 生产者 消费者 双向验证的工作方式、判断依据、项目边界和常见误区。
测试一个防抖输入框时用 fake timer 应验证哪几个时间点(未到间隔、恰好到间隔、连续触发)? 本文先给出可直接复述的结论,再用最小代码说明防抖 测试 fake timer的工作方式、判断依据、项目边界和常见误区。
为什么测试数据要用固定种子或显式构造而不是 Math.random,随机数据带来的不可重复失败如何诊断? 本文先给出可直接复述的结论,再用最小代码说明测试数据 确定性 随机种子的工作方式、判断依据、项目边界和常见误区。
Vitest 中 expect.assertions() 和 expect.hasAssertions() 在异步测试里分别防止什么漏检? 本文先给出可直接复述的结论,再用最小代码说明Vitest expect.assertions 异步断言漏检的工作方式、判断依据、项目边界和常见误区。
fake timer 开启后为什么有些测试会假死(例如等待真实请求超时),如何避免? 本文先给出可直接复述的结论,再用最小代码说明fake timer 卡死 真实请求的工作方式、判断依据、项目边界和常见误区。
fake timer 下异步代码卡在 await 上时,runAllTimersAsync 与 advanceTimersByTimeAsync 分别解决什么问题? 本文先给出可直接复述的结论,再用最小代码说明runAllTimersAsync 假定时器 微任务的工作方式、判断依据、项目边界和常见误区。
Vitest 的 vi.useFakeTimers() 如何跳过 setTimeout 等待,为什么必须配合 advanceTimersByTime 而非直接 await? 本文先给出可直接复述的结论,再用最小代码说明Vitest fake timers advanceTimersByTime的工作方式、判断依据、项目边界和常见误区。
vi.setSystemTime() 固定当前时间对测试 Date.now 依赖的代码(如过期判断)有什么价值,与时区问题的关系是什么? 本文先给出可直接复述的结论,再用最小代码说明vi.setSystemTime 固定时间 Date.now的工作方式、判断依据、项目边界和常见误区。
数据库类夹具选择「每用例全新数据」还是「共享只读基线数据」,各自适合什么测试目标? 本文先给出可直接复述的结论,再用最小代码说明测试夹具 共享数据 全新数据的工作方式、判断依据、项目边界和常见误区。
测试夹具(fixture)应该把环境搭建放在哪一层(每用例、每文件、全局),判断依据是什么? 本文先给出可直接复述的结论,再用最小代码说明测试 fixture 分层 setup teardown的工作方式、判断依据、项目边界和常见误区。
Playwright 的 web-first 断言(如 toBeVisible)为什么会自动重试,这与普通 expect 断言的竞态差异是什么? 本文先给出可直接复述的结论,再用最小代码说明Playwright web-first 断言 自动重试的工作方式、判断依据、项目边界和常见误区。
对 CI 上的不稳定(flaky)测试,重试机制、隔离与修复三种处理策略该如何排优先级? 本文先给出可直接复述的结论,再用最小代码说明flaky test 重试 隔离 修复的工作方式、判断依据、项目边界和常见误区。
需要模拟依赖第一次失败、第二次成功来测试重试逻辑时,mock 应如何表达调用序列并断言调用次数? 本文先给出可直接复述的结论,再用最小代码说明mock 模拟调用序列 测试重试逻辑的工作方式、判断依据、项目边界和常见误区。
mock、stub、spy 三者在验证行为上的分工差异是什么,什么场景必须验证交互而非状态? 本文先给出可直接复述的结论,再用最小代码说明mock stub spy 区别的工作方式、判断依据、项目边界和常见误区。
过度 mock 为什么会让测试在重构后大面积误报,判断该不该 mock 一条依赖的标准是什么? 本文先给出可直接复述的结论,再用最小代码说明过度 mock 脆弱测试 重构的工作方式、判断依据、项目边界和常见误区。
Vitest 并行执行测试文件时靠什么隔离模块状态,什么全局副作用仍会泄漏? 本文先给出可直接复述的结论,再用最小代码说明Vitest 并行 隔离 worker 模块的工作方式、判断依据、项目边界和常见误区。
如何用 vi.importActual 只替换模块的一个导出而保留其余真实实现,这种做法的风险是什么? 本文先给出可直接复述的结论,再用最小代码说明Vitest vi.importActual 部分 mock的工作方式、判断依据、项目边界和常见误区。
属性测试与示例测试的根本差异是什么,为什么「反序两次等于原数组」比固定用例更有覆盖力? 本文先给出可直接复述的结论,再用最小代码说明属性测试 property based testing 区别的工作方式、判断依据、项目边界和常见误区。
为排序函数写属性测试时,除了「结果有序」还应断言哪些不变量(长度守恒、多重集守恒)? 本文先给出可直接复述的结论,再用最小代码说明排序函数 属性测试 不变量的工作方式、判断依据、项目边界和常见误区。
单元测试为什么不应该发真实网络请求,违反后除了慢还有什么正确性风险? 本文先给出可直接复述的结论,再用最小代码说明单元测试 网络请求 隔离的工作方式、判断依据、项目边界和常见误区。
属性测试发现失败用例后的 shrink(收缩)过程在做什么,为什么它对定位根因至关重要? 本文先给出可直接复述的结论,再用最小代码说明属性测试 shrinking 最小反例的工作方式、判断依据、项目边界和常见误区。
什么时候该用软断言(soft assertions)让一个用例报告多个失败,代价是什么? 本文先给出可直接复述的结论,再用最小代码说明软断言 soft assertions 使用场景的工作方式、判断依据、项目边界和常见误区。
vi.spyOn 监视对象方法后为什么必须在测试间恢复,不恢复会引发什么跨用例污染? 本文先给出可直接复述的结论,再用最小代码说明Vitest spyOn restoreMocks的工作方式、判断依据、项目边界和常见误区。
为什么单元测试之间必须相互独立,共享可变状态会导致哪些难以诊断的失败模式? 本文先给出可直接复述的结论,再用最小代码说明单元测试 隔离性 共享状态的工作方式、判断依据、项目边界和常见误区。
发现一个测试单独运行通过、整套运行时失败,应按什么思路诊断顺序依赖? 本文先给出可直接复述的结论,再用最小代码说明测试顺序依赖 单独运行通过 排查的工作方式、判断依据、项目边界和常见误区。
除了时间与时区,还有哪些环境因素(语言环境、区域格式、文件系统大小写)会让同一测试在不同机器结果不同? 本文先给出可直接复述的结论,再用最小代码说明测试可重复性 时区 locale 环境差异的工作方式、判断依据、项目边界和常见误区。
「测行为不测实现」原则下,哪些断言(调用内部私有方法、检查内部状态)属于脆弱的实现耦合? 本文先给出可直接复述的结论,再用最小代码说明测试行为 不测实现 重构的工作方式、判断依据、项目边界和常见误区。
Testing Library 的 waitFor 与 findBy 查询都带等待,两者适用场景与超时失败信息有何不同? 本文先给出可直接复述的结论,再用最小代码说明Testing Library waitFor 与 findBy 区别的工作方式、判断依据、项目边界和常见误区。
Vitest 的 toBe、toEqual、toStrictEqual 在比较对象和类实例时行为差异是什么? 本文先给出可直接复述的结论,再用最小代码说明Vitest toBe toEqual toStrictEqual 区别的工作方式、判断依据、项目边界和常见误区。