关于 mocking-stubbing
mocking-stubbing 是通过将依赖替换为可控测试替身,隔离代码进行测试的技能。它提供 JavaScript/TypeScript、Python 和 Java 测试示例与指导。
主要功能
- 01用测试替身替代外部依赖
- 02验证对象间的交互
- 03模拟错误和边界情况
- 04Jest、unittest.mock 和 Mockito 指南
- 05模拟对象的设置与复用实践
适用场景
- 01不调用数据库或网络来测试服务
- 02无需触发真实故障即可覆盖失败路径
- 03测试涉及时间或随机性的行为
- 04在单元测试中避免缓慢或昂贵操作
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ aj-geddes/ useful-ai-prompts --skill mocking-stubbing安装后在 Claude Code 中输入/mocking-stubbing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/advanced-mocking-patterns.mdjest-mocking-javascripttypescript.mdmockito-for-java.mdpython-mocking-with-unittestmock.mdscripts/scaffold-tests.shtemplates/test-template.js详细介绍
模拟与打桩
目录
概述
模拟与打桩是测试期间隔离代码单元的重要技术,可通过受控的测试替身来替换依赖项。这样可以编写快速、可靠且专注的单元测试,而不依赖数据库、API 或文件系统等外部系统。
适用场景
- 将单元测试与外部依赖项隔离
- 测试依赖耗时操作(数据库、网络)的代码
- 模拟错误条件和边缘情况
- 验证对象之间的交互
- 测试行为不确定的代码(时间、随机性)
- 避免在测试中执行开销较大的操作
- 无需触发真实故障即可测试错误处理
快速开始
最简可用示例:
// services/UserService.ts
import { UserRepository } from "./UserRepository";
import { EmailService } from "./EmailService";
export class UserService {
constructor(
private userRepository: UserRepository,
private emailService: EmailService,
) {}
async createUser(userData: CreateUserDto) {
const user = await this.userRepository.create(userData);
await this.emailService.sendWelcomeEmail(user.email, user.name);
return user;
}
async getUserStats(userId: string) {
const user = await this.userRepository.findById(userId);
if (!user) throw new Error("User not found");
const orderCount = await this.userRepository.getOrderCount(userId);
return { ...user, orderCount };
}
}
// ... (see reference guides for full implementation)
参考指南
references/ 目录中的详细实现:
| 指南 | 内容 |
|---|---|
| Jest 模拟(JavaScript/TypeScript) | Jest 模拟(JavaScript/TypeScript) |
| 使用 unittest.mock 进行 Python 模拟 | 使用 unittest.mock 进行 Python 模拟 |
| Java 的 Mockito | Java 的 Mockito |
| 高级模拟模式 | 高级模拟模式 |
最佳实践
✅ 应该做
- 模拟外部依赖项(数据库、API、文件系统)
- 使用依赖注入,让模拟更容易
- 使用模拟对象验证重要交互
- 在测试之间重置模拟对象
- 在边界层(存储库、服务)进行模拟
- 必要时使用间谍进行部分模拟
- 创建可复用的模拟工厂
- 测试成功和失败两种情况
❌ 不应该做
- 模拟所有内容(不要模拟自己编写的内容)
- 对模拟交互进行过度指定
- 在集成测试中使用模拟对象
- 模拟简单的实用函数
- 创建复杂的模拟层次结构
- 忘记验证模拟调用
- 在多个测试之间共享模拟对象
- 仅为让测试通过而进行模拟
评论
支持 Markdown