mcpField
W
writing-tests

writing-tests

github.com/spencerpauly测试与质量868506 次安装13 周前更新
代码仓库

关于 writing-tests

writing-tests 是一项帮助开发者为现有代码编写测试或提升覆盖率的技能。它先识别项目测试配置和代码约定,再指导编写、运行和调整测试。

主要功能

  1. 01识别测试运行器与项目约定
  2. 02分析公开 API 和代码路径
  3. 03按项目惯例创建测试文件
  4. 04编写边界与异步测试
  5. 05模拟外部依赖
  6. 06运行测试并处理失败

适用场景

  1. 01为现有模块补充单元测试
  2. 02为 React 组件编写行为测试
  3. 03覆盖错误处理与边界情况

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/spencerpauly/awesome-cursor-skills --skill writing-tests

安装后在 Claude Code 中输入/writing-tests确认已加载。

详细介绍

编写测试

当用户要求为现有代码添加测试、提高测试覆盖率,或为特定文件或模块编写测试时,请使用此技能。

步骤

  1. 检测测试设置 — 检查已配置的内容:

    # Check package.json for test runner
    cat package.json | grep -E "jest|vitest|mocha|playwright|cypress"
    

    查找配置文件:vitest.config.ts、jest.config.ts、playwright.config.ts、.mocharc.*。检查现有测试文件,了解项目的测试模式和约定。

  2. 如果没有测试运行器 — 进行配置:

    npm install -D vitest @testing-library/react @testing-library/jest-dom
    

    在 package.json 中添加 test 脚本:

    { "test": "vitest run", "test:watch": "vitest" }
    
  3. 分析目标代码 — 阅读要测试的文件,并识别:

    • 公共 API:导出的函数、类、组件、钩子
    • 代码路径:条件分支、错误处理、边界情况
    • 依赖项:需要模拟的外部服务、数据库、API
    • 副作用:文件 I/O、网络调用、DOM 变更
  4. 创建测试文件 — 将其放在源文件旁边或 __tests__/ 目录中,并遵循项目惯例:

    • src/utils/format.ts → src/utils/format.test.ts
    • src/components/Button.tsx → src/components/Button.test.tsx
  5. 按照以下结构编写测试:

    import { describe, it, expect, vi } from "vitest";
    
    describe("functionName", () => {
      // Happy path
      it("returns formatted output for valid input", () => { ... });
    
      // Edge cases
      it("handles empty string", () => { ... });
      it("handles null/undefined input", () => { ... });
    
      // Error cases
      it("throws on invalid argument", () => { ... });
    
      // Boundary conditions
      it("handles maximum length input", () => { ... });
    });
    
  6. 模拟外部依赖项 — 不要在单元测试中进行真实的 API 调用或数据库查询:

    vi.mock("@/lib/db", () => ({
      query: vi.fn().mockResolvedValue([{ id: 1, name: "test" }]),
    }));
    

    对于 React 组件,模拟用于获取数据的钩子:

    vi.mock("@/hooks/useUser", () => ({
      useUser: () => ({ user: { name: "Test" }, isLoading: false }),
    }));
    
  7. 使用 Testing Library 测试 React 组件:

    import { render, screen, fireEvent } from "@testing-library/react";
    
    it("renders the button and handles click", () => {
      const onClick = vi.fn();
      render(<Button onClick={onClick}>Click me</Button>);
      fireEvent.click(screen.getByRole("button", { name: "Click me" }));
      expect(onClick).toHaveBeenCalledOnce();
    });
    
  8. 运行测试并确认通过:

    npm test
    

    如果有测试失败,请修复测试或代码(具体取决于错误出在测试预期还是实现)。

测试内容

  • 始终测试:公共 API、错误处理、边界情况(空、null、零、负数)、状态转换、异步行为
  • 跳过测试:私有实现细节、第三方库内部逻辑、简单的 getter/setter、仅类型代码

说明

  • 遵循项目现有的测试风格——如果项目使用 test() 而不是 it(),也请使用 test()。
  • 不要测试实现细节——测试行为和输出,而不是内部方法调用。
  • 使用能说明场景的测试名称,例如“购物车为空时返回 0”,而不是“test1”。
  • 每个测试只验证一个断言概念——如果多个 expect 调用验证的是同一行为,也可以使用。
  • 对于异步代码,始终对结果使用 await,或使用 resolves/rejects 匹配器。

评论

支持 Markdown