用途:当被测类依赖慢速、外部或非确定性的协作者(如支付网关、消息总线),或需要验证 persist()、flush()、消息派发等交互,或需要为仓储提供内存假实现时,使用本技能创建测试替身。
主要能力:按需选择替身类型——stub 提供返回值、mock 验证调用、fake 提供可工作的简化实现;用 $this->createMock(Interface::class) 创建,用 ->method('charge')->willReturn(...) 打桩;仅在交互重要时验证,如 expects($this->once())->with(...),或用 $this->callback() 检查派发的消息;用 willReturnOnConsecutiveCalls()、willThrowException() 或 willReturnCallback() 编排行为;为仓储编写实现接口的 InMemory fake;仅当项目已依赖 Prophecy 时使用 ProphecyTrait 配合 prophesize() 与 reveal()。
使用方式:先按需求挑选替身类型,再创建并打桩,最后只验证真正重要的交互。
限制与护栏:不要 mock 被测类本身,部分 mock(onlyMethods())是最后手段;mock 接口而非具体类;优先 stub 而非 mock,每个测试只保留一个 mock 断言;不要过度 mock,涉及数据库的行为应放在使用真实仓储的功能测试中。
输出约定:说明每个协作者所选替身类型及原因、所验证的交互(仅限重要者)、以及在 tests/Fake 下新增的 fake(如有)。
更多实现细节见 reference.md。