关于 test-doubles-mocking
test-doubles-mocking 是用于 Symfony 测试的技能,帮助隔离协作者并验证交互。它指导选择和使用 dummy、stub、mock、spy 与 fake,并避免过度模拟。
主要功能
- 01按测试需求选择测试替身
- 02使用 PHPUnit 创建 stub 和 mock
- 03验证相关调用与消息
- 04编排返回值、异常和回调
- 05构建内存版仓库 fake
适用场景
- 01测试依赖外部服务的代码
- 02验证持久化或消息派发
- 03提供内存版仓库实现
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dev-toolings/ superpowers-symfony --skill test-doubles-mocking安装后在 Claude Code 中输入/test-doubles-mocking确认已加载。
附带文件reference.md
详细介绍
测试替身模拟(Symfony)
适用场景
- 被测类依赖某个速度较慢、外部或非确定性的协作者,例如支付网关或消息总线。
- 需要验证交互,例如
persist()和flush(),或已派发的消息。 - 仓库需要一个实现其接口的内存假对象。
- 需要在 dummy、stub、mock、spy 或 fake 之间进行选择。
默认工作流
- 根据需求选择测试替身:用 stub 提供值,用 mock 验证调用,用 fake 提供可用的简化实现。
- 使用
$this->createMock(Interface::class)创建 mock,并通过->method('charge')->willReturn(...)设置 stub。 - 仅在交互至关重要时进行验证:使用
expects($this->once())->with(...),或使用$this->callback()检查已派发的消息。 - 使用
willReturnOnConsecutiveCalls()、willThrowException()或willReturnCallback()编写行为脚本。 - 对于仓库,编写一个实现该接口的
InMemoryfake。 - 仅当项目已使用 Prophecy 时,才使用
ProphecyTrait、prophesize()和reveal()。
注意事项
- 不要模拟被测类;部分模拟(
onlyMethods())应作为最后手段。 - 模拟接口,而非具体类。
- 优先使用 stub 而非 mock,每个测试只编写一个 mock 断言。
- 不要过度模拟:涉及数据库的行为应使用真实仓库编写功能测试。
渐进式展开
- 使用此文件了解执行规范和风险控制措施。
- 需要深入了解实现细节时,再打开参考资料。
输出约定
- 说明为每个协作者选择的测试替身类型及原因。
- 仅验证重要的交互。
- 如有添加 fake,将其放在
tests/Fake下。
参考资料
reference.md
评论
支持 Markdown