尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

react-fake-props 限制与规避方案:custom 验证器与 instanceOf 无法自动生成时怎么办

react-fake-props 限制与规避方案:custom 验证器与 instanceOf 无法自动生成时怎么办 react-fake-props 限制与规避方案custom 验证器与 instanceOf 无法自动生成时怎么办【免费下载链接】react-fake-props Magically generate fake props for your React tests项目地址: https://gitcode.com/gh_mirrors/re/react-fake-propsreact-fake-props是一个为 React 测试自动魔法生成假 props 的库它通过 react-docgen 解析组件的 TypeScript、Flow 或 PropTypes 类型定义生成一组结构合法的假数据fake props省去手工造测试数据的工作量。但它有两个明确的边界自定义验证器custom validator和PropTypes.instanceOf无法自动生成需要手动补上。本文用 5 个步骤讲清楚为什么生成不了、如何识别占位字符串以及一套可直接照做的规避方案。为什么这两类 props 无法自动生成理解限制的原理才能知道该在哪里绕过去。custom 验证器PropTypes 允许用一个函数来校验某个 prop比如值必须包含某个字符串。这类校验逻辑只存在于函数内部而 react-fake-props 是基于静态解析类型元数据工作的它看不到函数体里的校验规则自然不知道该造出什么值。instanceOf该类型要求传入值必须是某个类的实例如PropTypes.instanceOf(Message)。静态解析拿不到这个类的运行时引用无法new出真实对象。因此官方策略很务实不瞎猜而是输出一句带提示的占位字符串提醒你这里得手动来。相关实现见 fakeCustom / fakeInstanceOf文档声明见 README 的 Please note 部分。如何识别未生成的占位字符串️ 当optional: true时所有可选 props 都会被生成其中两类特殊类型会输出固定的提示文案类型生成的占位值识别关键词custom验证器custom type not supported, please set the correct value for xxx propcustom type not supportedinstanceOfinstanceOf type not supported, please set the correct value for xxx propinstanceOf type not supported实际效果可以参考项目的测试快照 propTypes.js.snap其中customProp与optionalMessage就是典型的占位输出输入样例则是包含这两种类型的 fixtures/propTypes/Component.jsx。 实用技巧拿到 props 后遍历一遍查找not supported字样就能定位所有需要手动补值的字段不用逐个肉眼比对。规避方案四步补齐缺失的 props第 1 步正常生成基础 fake propsimport path from path import fakeProps from react-fake-props const componentPath path.join(__dirname, ./MyComponent.jsx) const props fakeProps(componentPath, { optional: true })第 2 步扫描占位字符串const missing Object.entries(props) .filter(([, v]) typeof v string v.includes(not supported)) .map(([k]) k) // 例如: [customProp, optionalMessage]第 3 步手动覆盖这两类字段props.customProp matchme-abc // 满足你的自定义校验规则 props.optionalMessage new Message() // 传入真实类实例第 4 步展开使用Wrapper MyComponent {...props} / /Wrapper 注意展开时手动值放在后面或在展开前直接改props对象确保覆盖占位字符串而不是被它覆盖。进阶技巧让测试更稳的小建议用 props 断言不要写死字符串react-fake-props 的输出可能随版本变化断言渲染内容时用props.name而不是name官方 Tip 也是这么建议的wrapper.text().to.contain(props.name) // ✅ 好 wrapper.text().to.contain(name) // ❌ 坏instanceOf用 mock 实例即可测试不关心真实业务逻辑时new Message()的空实例或轻量 mock 就够用不要为此引入复杂 fixture。一个文件多个组件时配合all: true手动补值前先按displayName找到目标组件避免给错误的组件补 props。参考 fixtures/propTypes/Multiple.jsx 这类多组件场景。能改类型定义就改如果 custom 校验规则其实就是字符串里包含某词且业务上无强需求评估是否降级为PropTypes.string 组件内校验让自动生成覆盖更多字段——这是减少手工维护量的根本办法。局限性速查表能力是否支持自动生成规避方式string / number / bool / array / object✅无需处理shape / arrayOf / objectOf嵌套✅ 递归生成无需处理optional: true包含可选 props✅按需开启PropTypes.oneOf枚举✅ 取第一个合法值需其它值时手动覆盖custom 验证器❌ 占位字符串手动赋值PropTypes.instanceOf❌ 占位字符串手动传入类实例传入组件文件路径而非组件本身✅ 必须API 要求总结react-fake-props 的价值在于把 80% 常规 props 的造数工作自动化而 custom 验证器与 instanceOf 属于它声明放弃的 20%。记住三句话即可应对看原理静态解析读不到函数体与运行时类所以这两类必然生成不了认标记not supported占位字符串就是你的待办清单做覆盖展开前手动补齐对应字段测试立刻可用。按这套规避方案即使组件里有再刁钻的校验器你的测试数据也能保持大部分自动、少数手工的健康比例 。【免费下载链接】react-fake-props Magically generate fake props for your React tests项目地址: https://gitcode.com/gh_mirrors/re/react-fake-props创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表