mcpField
M
mocking-stubbing

mocking-stubbing

github.com/aj-geddes测试与质量373429 次安装34 周前更新
代码仓库

关于 mocking-stubbing

mocking-stubbing 是通过将依赖替换为可控测试替身,隔离代码进行测试的技能。它提供 JavaScript/TypeScript、Python 和 Java 测试示例与指导。

主要功能

  1. 01用测试替身替代外部依赖
  2. 02验证对象间的交互
  3. 03模拟错误和边界情况
  4. 04Jest、unittest.mock 和 Mockito 指南
  5. 05模拟对象的设置与复用实践

适用场景

  1. 01不调用数据库或网络来测试服务
  2. 02无需触发真实故障即可覆盖失败路径
  3. 03测试涉及时间或随机性的行为
  4. 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.md
jest-mocking-javascripttypescript.md
mockito-for-java.md
python-mocking-with-unittestmock.md
scripts/
scaffold-tests.sh
templates/
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 的 MockitoJava 的 Mockito
高级模拟模式高级模拟模式

最佳实践

✅ 应该做
  • 模拟外部依赖项(数据库、API、文件系统)
  • 使用依赖注入,让模拟更容易
  • 使用模拟对象验证重要交互
  • 在测试之间重置模拟对象
  • 在边界层(存储库、服务)进行模拟
  • 必要时使用间谍进行部分模拟
  • 创建可复用的模拟工厂
  • 测试成功和失败两种情况
❌ 不应该做
  • 模拟所有内容(不要模拟自己编写的内容)
  • 对模拟交互进行过度指定
  • 在集成测试中使用模拟对象
  • 模拟简单的实用函数
  • 创建复杂的模拟层次结构
  • 忘记验证模拟调用
  • 在多个测试之间共享模拟对象
  • 仅为让测试通过而进行模拟

评论

支持 Markdown