用途:这是一条测试编写原则,适用于编写、修改或保留测试时。核心要求是像使用者那样调用代码,并断言其可观察结果或契约,而不是断言内部调用或复制的常量。
主要能力:给出一个检查方法——在保留某个测试前,先引入一个相关缺陷,确认该测试会失败。当需要返回确定结果时,返回 undefined 可作为有用的探针;但若负路径测试的正确结果本就是“不存在”或关系契约,则不受此影响。
五类可能漏测相关行为的测试形态:
- 断言过弱或缺失:没有 expect,或断言覆盖契约太少。toBeDefined、toBeTruthy、toBeInstanceOf、toBeGreaterThan(0) 会在 undefined 时失败,但可能接受错误的已定义结果。
- 只查 mock 或只查不存在:只检查 mock 被调用可能漏掉错误载荷。not.toThrow、not.toHaveBeenCalled、toBeUndefined、toEqual([])、toHaveLength(0) 在“不存在”是所需行为时有用,但应确认错误的出现或副作用会导致测试失败。
- 自引用:期望值由同一条有缺陷的路径计算,会掩盖缺陷,如 expect(f(a)).toBe(f(a));若比较能检测出相关分歧,比较两种实现仍可测试所需关系。
- 常量钉死:复述附带常量会阻碍重构而不测试行为,如 expect(LIMITS.maxTools).toBe(8);应保留强制真实契约的提示词、配置和表格检查。
- 夹具断言夹具:断言读取的是测试自己构造的数据,被测对象从未运行;若断言观察其结果,在 beforeEach 中调用的被测对象仍可被测试。
修正方式:在测试体内用具体输入调用被测对象,并断言字面输出或可观察效果,例如 expect(slugify("Hello, World!")).toBe("hello-world")。对于“不存在”,走负路径并证明错误的出现或副作用会失败;可另加正路径测试作对比。对于附带常量,测试读取它的机制。对于 mock,当载荷或可观察状态属于契约时,断言它们。仅当测试不检查任何相关行为或契约时,才重写或删除。
保留项:跨表格行的关系测试(如某键同时存在于两张表、父项存在),以及 *.test-d.ts 文件中的编译期检查。
限制:资料未提供该原则的适用语言、框架、安装方式或工具集成信息。