mcpField
J
javascript-testing

javascript-testing

github.com/autumnsgrove测试与质量672 次安装6 天前更新
代码仓库

关于 javascript-testing

用于编写、配置和运行 JavaScript 与 TypeScript 测试的技能,提供测试框架选择建议,以及单元、组件、模拟和 SvelteKit 测试示例。

主要功能

  1. 01Vitest 与 Jest 选择建议
  2. 02测试配置与 AAA 结构
  3. 03模拟与间谍示例
  4. 04Svelte 组件测试
  5. 05SvelteKit 加载函数与表单操作测试
  6. 06覆盖率与测试命令

适用场景

  1. 01为 JavaScript 项目配置测试
  2. 02测试 React、Svelte 或 Vue 组件
  3. 03在单元测试中模拟 API 调用
  4. 04测试 SvelteKit 加载函数与表单操作

安装

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

$npx skills add https://github.com/autumnsgrove/lattice --skill javascript-testing

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

详细介绍

JavaScript/TypeScript 测试技能

激活时机

在以下情况下激活此技能:

  • 编写 JavaScript 或 TypeScript 测试
  • 测试 Svelte、React 或 Vue 组件
  • 配置 Vitest 或 Jest
  • 使用模拟、间谍或测试工具
  • 运行测试或检查覆盖率

框架选择

使用场景框架
SvelteKit、Vite 项目Vitest(推荐)
非 Vite 项目、React NativeJest

快速命令

Vitest
npx vitest              # Watch mode
npx vitest run          # Single run (CI)
npx vitest run --coverage
npx vitest --ui         # Visual UI
Jest
pnpm test
pnpm test --watch
pnpm test --coverage

测试结构:AAA 模式

import { describe, it, expect, beforeEach } from 'vitest';

describe('UserService', () => {
    let userService: UserService;

    beforeEach(() => {
        userService = new UserService();
    });

    it('should create a new user with valid data', () => {
        // Arrange
        const email = '[email protected]';
        const password = 'secure_pass123';

        // Act
        const result = userService.register(email, password);

        // Assert
        expect(result.success).toBe(true);
        expect(result.user.email).toBe(email);
    });
});

Vitest 配置(SvelteKit)

// vite.config.ts
import { defineConfig } from 'vitest/config';
import { sveltekit } from '@sveltejs/kit/vite';

export default defineConfig({
    plugins: [sveltekit()],
    test: {
        include: ['src/**/*.{test,spec}.{js,ts}'],
        globals: true,
        environment: 'jsdom',
        setupFiles: ['./src/tests/setup.ts'],
    }
});

模拟

Vitest
import { vi } from 'vitest';

vi.mock('./api', () => ({
    fetchUser: vi.fn()
}));

vi.mocked(fetchUser).mockResolvedValue({ id: 1, name: 'John' });
Jest
jest.mock('./api', () => ({
    fetchUser: jest.fn()
}));

组件测试(Svelte)

import { render, screen, fireEvent } from '@testing-library/svelte';
import Counter from './Counter.svelte';

it('should increment count on click', async () => {
    render(Counter, { props: { initialCount: 0 } });

    const button = screen.getByRole('button', { name: /increment/i });
    await fireEvent.click(button);

    expect(screen.getByText('Count: 1')).toBeInTheDocument();
});

常见断言

// Equality
expect(value).toBe(expected);           // Strict ===
expect(value).toEqual(expected);        // Deep equality

// Truthiness
expect(value).toBeTruthy();
expect(value).toBeNull();

// Arrays/Objects
expect(array).toContain(item);
expect(obj).toHaveProperty('key');

// Exceptions
expect(() => fn()).toThrow('error');

// Async
await expect(promise).resolves.toBe(value);
await expect(promise).rejects.toThrow();

查询优先级(Testing Library)

  1. getByRole - 无障碍查询(最佳)
  2. getByLabelText - 表单字段
  3. getByPlaceholderText - 输入框
  4. getByText - 非交互元素
  5. getByTestId - 最后选择

目录结构

src/
├── lib/
│   ├── components/
│   │   ├── Button.svelte
│   │   └── Button.test.ts
│   └── utils/
│       ├── format.ts
│       └── format.test.ts
└── tests/
    ├── setup.ts
    └── integration/

SvelteKit 测试

Load 函数
import { load } from './+page.server';

it('should fetch posts', async () => {
    const mockFetch = vi.fn().mockResolvedValue({
        json: () => Promise.resolve([{ id: 1 }])
    });

    const result = await load({ fetch: mockFetch } as any);
    expect(result.posts).toHaveLength(1);
});
表单操作
import { actions } from './+page.server';

it('should validate login', async () => {
    const formData = new FormData();
    formData.set('email', '[email protected]');

    const request = new Request('http://localhost', {
        method: 'POST',
        body: formData
    });

    const result = await actions.default({ request } as any);
    expect(result.success).toBe(true);
});

相关资源

查看 AgentUsage/testing_javascript.md,了解完整文档,包括:

  • Jest 配置
  • 异步测试模式
  • SvelteKit 专用模式
  • CI/CD 集成

评论

支持 Markdown