JavaScript/TypeScript Testing Skill
When to Activate
Activate this skill when:
-
Writing JavaScript or TypeScript tests
-
Testing Svelte, React, or Vue components
-
Setting up Vitest or Jest configuration
-
Working with mocks, spies, or test utilities
-
Running tests or checking coverage
Framework Selection
Use Case Framework
SvelteKit, Vite projects Vitest (recommended)
Non-Vite projects, React Native Jest
Quick Commands
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
Test Structure: AAA Pattern
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);
});
});
Vitest Setup (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'], } });
Mocking
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() }));
Component Testing (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();
});
Common Assertions
// 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();
Query Priority (Testing Library)
-
getByRole
-
Accessible queries (best)
-
getByLabelText
-
Form fields
-
getByPlaceholderText
-
Inputs
-
getByText
-
Non-interactive elements
-
getByTestId
-
Last resort
Directory Structure
src/ ├── lib/ │ ├── components/ │ │ ├── Button.svelte │ │ └── Button.test.ts │ └── utils/ │ ├── format.ts │ └── format.test.ts └── tests/ ├── setup.ts └── integration/
SvelteKit Testing
Load Functions
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);
});
Form Actions
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);
});
Related Resources
See AgentUsage/testing_javascript.md for complete documentation including:
-
Jest configuration
-
Async testing patterns
-
SvelteKit-specific patterns
-
CI/CD integration