用途:该技能针对一种代码坏味道——单元测试为了触达自然 API 不会暴露的不变量,迫使生产代码被拆成“纯内层”和“薄外层”,内层仅为测试而导出。这种拆分对外不可见(只有一个生产调用方、无复用),却成为永久结构,使测试套件变成架构的客户。技能的目标是把碎片粘回一个函数,并用其他方式支付回归覆盖成本。
主要能力:提供一套六步流程——统计生产调用方(grep 内层函数名,排除测试文件,若为 1 则继续,≥2 则重新评估);阅读外层(若其主体只是调用内层加格式化/IO/接线,则可内联);阅读测试(对每个 expect() 追问观察的是什么,若只观察通过接缝可见的内部状态,说明测试在驱动拆分);统计 LOC(测试 LOC 对比被测代码 LOC,若测试是最大产物且唯一消费者是自己,则成本收益倒挂);内联(把内层主体移入外层,删除导出与接缝);以不同方式支付覆盖账单(通过真实边界的集成测试、类型级不变量如 T extends Disposable 或品牌返回类型、或删除测试并在提交中说明回归风险可接受)。
使用方式:技能文档给出审计扫描命令,用于查找“测试与被测文件 LOC 比过高”以及“导出函数带可选 deps/overrides 参数”“成对 getter/setter 参数”的候选点,例如: for t in $(find packages apps -name '.test.ts' -not -path '/node_modules/'); do s="${t%.test.ts}.ts" [ -f "$s" ] || continue tl=$(wc -l < "$t" | tr -d ' ') sl=$(wc -l < "$s" | tr -d ' ') [ "$sl" -lt 1 ] && continue ratio=$(( tl * 10 / sl )) [ "$ratio" -ge 25 ] && echo "$t ($tl) vs $s ($sl) ratio=${ratio}/10" done 以及 grep -rEn 'export (async )?function [a-zA-Z]+([^)]\bdeps??: ' packages/ apps/ --include='*.ts' 等。每个匹配只是候选,需逐一跑六步流程。
适用场景:常见坏味道形式包括成对 getter/setter、为替换假实现而设的可选 deps、纯内层+薄外层、仅注入状态的 mock、为测试而重导出的内部函数。
限制:并非所有拆分都应内联。若内层有多个真实生产消费者、其主体复杂到足以成为独立概念、跨越真实包边界(不同运行时/进程/部署单元)、注入依赖属于调用方拥有的策略(错误处理、重载、重试),或内联会使外层超过约 60-80 行可读上限,则应保留拆分。判断标准是:如果没有测试,我还会把它写成两块吗?会则保留,不会则内联。资料未提供该技能的收费、平台或安装方式信息。