重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
javascript-testing by autumnsgrove/groveengine
npx skills add https://github.com/autumnsgrove/groveengine --skill javascript-testing在以下情况下激活此技能:
| 使用场景 | 框架 |
|---|---|
| SvelteKit、Vite 项目 | Vitest(推荐) |
| 非 Vite 项目、React Native | Jest |
npx vitest # 监视模式
npx vitest run # 单次运行(CI)
npx vitest run --coverage
npx vitest --ui # 可视化 UI
pnpm test
pnpm test --watch
pnpm test --coverage
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
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', () => {
// 准备
const email = 'test@example.com';
const password = 'secure_pass123';
// 执行
const result = userService.register(email, password);
// 断言
expect(result.success).toBe(true);
expect(result.user.email).toBe(email);
});
});
// 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'],
}
});
import { vi } from 'vitest';
vi.mock('./api', () => ({
fetchUser: vi.fn()
}));
vi.mocked(fetchUser).mockResolvedValue({ id: 1, name: 'John' });
jest.mock('./api', () => ({
fetchUser: jest.fn()
}));
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();
});
// 相等性
expect(value).toBe(expected); // 严格相等 ===
expect(value).toEqual(expected); // 深度相等
// 真值性
expect(value).toBeTruthy();
expect(value).toBeNull();
// 数组/对象
expect(array).toContain(item);
expect(obj).toHaveProperty('key');
// 异常
expect(() => fn()).toThrow('error');
// 异步
await expect(promise).resolves.toBe(value);
await expect(promise).rejects.toThrow();
getByRole - 可访问性查询(最佳)getByLabelText - 表单字段getByPlaceholderText - 输入框getByText - 非交互元素getByTestId - 最后手段src/
├── lib/
│ ├── components/
│ │ ├── Button.svelte
│ │ └── Button.test.ts
│ └── utils/
│ ├── format.ts
│ └── format.test.ts
└── tests/
├── setup.ts
└── integration/
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', 'test@example.com');
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 获取完整文档,包括:
每周安装次数
48
代码仓库
GitHub 星标数
2
首次出现
2026年2月5日
安全审计
已安装于
opencode48
gemini-cli48
codex48
github-copilot47
amp47
cline47
Activate this skill when:
| Use Case | Framework |
|---|---|
| SvelteKit, Vite projects | Vitest (recommended) |
| Non-Vite projects, React Native | Jest |
npx vitest # Watch mode
npx vitest run # Single run (CI)
npx vitest run --coverage
npx vitest --ui # Visual UI
pnpm test
pnpm test --watch
pnpm test --coverage
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 = 'test@example.com';
const password = 'secure_pass123';
// Act
const result = userService.register(email, password);
// Assert
expect(result.success).toBe(true);
expect(result.user.email).toBe(email);
});
});
// 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'],
}
});
import { vi } from 'vitest';
vi.mock('./api', () => ({
fetchUser: vi.fn()
}));
vi.mocked(fetchUser).mockResolvedValue({ id: 1, name: 'John' });
jest.mock('./api', () => ({
fetchUser: jest.fn()
}));
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();
getByRole - Accessible queries (best)getByLabelText - Form fieldsgetByPlaceholderText - InputsgetByText - Non-interactive elementsgetByTestId - Last resortsrc/
├── lib/
│ ├── components/
│ │ ├── Button.svelte
│ │ └── Button.test.ts
│ └── utils/
│ ├── format.ts
│ └── format.test.ts
└── tests/
├── setup.ts
└── integration/
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', 'test@example.com');
const request = new Request('http://localhost', {
method: 'POST',
body: formData
});
const result = await actions.default({ request } as any);
expect(result.success).toBe(true);
});
See AgentUsage/testing_javascript.md for complete documentation including:
Weekly Installs
48
Repository
GitHub Stars
2
First Seen
Feb 5, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode48
gemini-cli48
codex48
github-copilot47
amp47
cline47
Vue 3 调试指南:解决响应式、计算属性与监听器常见错误
12,000 周安装
GSAP Utils 工具函数详解:数学运算、数组处理与动画值映射 | GSAP 开发指南
3,700 周安装
GSAP时间轴动画教程:创建多步骤序列动画与关键帧控制
3,800 周安装
Google Workspace CLI 模型响应安全清理工具 | Model Armor sanitize-response 命令使用指南
7,700 周安装
飞书会议纪要自动化汇总工作流:一键生成会议周报与纪要文档
41,500 周安装
飞书日程待办摘要工作流:AI自动生成每日/每周开工报告,提升个人生产力
41,500 周安装
Lark Calendar CLI 工具:智能日程管理与会议预约自动化命令行解决方案
41,800 周安装