Testing

vitest - Claude MCP Skill

Vitest unit testing patterns with React Testing Library. Trigger: When writing unit tests for React components, hooks, or utilities.

SEO Guide: Enhance your AI agent with the vitest tool. This Model Context Protocol (MCP) server allows Claude Desktop and other LLMs to vitest unit testing patterns with react testing library. trigger: when writing unit tests for react ... Download and configure this skill to unlock new capabilities for your AI workflow.

🌟391 stars • 2035 forks
šŸ“„0 downloads

Documentation

SKILL.md
> **For E2E tests**: Use `prowler-test-ui` skill (Playwright).
> This skill covers **unit/integration tests** with Vitest + React Testing Library.

## Test Structure (REQUIRED)

Use **Given/When/Then** (AAA) pattern with comments:

```typescript
it("should update user name when form is submitted", async () => {
  // Given - Arrange
  const user = userEvent.setup();
  const onSubmit = vi.fn();
  render(<UserForm onSubmit={onSubmit} />);

  // When - Act
  await user.type(screen.getByLabelText(/name/i), "John");
  await user.click(screen.getByRole("button", { name: /submit/i }));

  // Then - Assert
  expect(onSubmit).toHaveBeenCalledWith({ name: "John" });
});
```

---

## Describe Block Organization

```typescript
describe("ComponentName", () => {
  describe("when [condition]", () => {
    it("should [expected behavior]", () => {});
  });
});
```

**Group by behavior, NOT by method.**

---

## Query Priority (REQUIRED)

| Priority | Query | Use Case |
|----------|-------|----------|
| 1 | `getByRole` | Buttons, inputs, headings |
| 2 | `getByLabelText` | Form fields |
| 3 | `getByPlaceholderText` | Inputs without label |
| 4 | `getByText` | Static text |
| 5 | `getByTestId` | Last resort only |

```typescript
// āœ… GOOD
screen.getByRole("button", { name: /submit/i });
screen.getByLabelText(/email/i);

// āŒ BAD
container.querySelector(".btn-primary");
```

---

## userEvent over fireEvent (REQUIRED)

```typescript
// āœ… ALWAYS use userEvent
const user = userEvent.setup();
await user.click(button);
await user.type(input, "hello");

// āŒ NEVER use fireEvent for interactions
fireEvent.click(button);
```

---

## Async Testing Patterns

```typescript
// āœ… findBy for elements that appear async
const element = await screen.findByText(/loaded/i);

// āœ… waitFor for assertions
await waitFor(() => {
  expect(screen.getByText(/success/i)).toBeInTheDocument();
});

// āœ… ONE assertion per waitFor
await waitFor(() => expect(mockFn).toHaveBeenCalled());
await waitFor(() => expect(screen.getByText(/done/i)).toBeVisible());

// āŒ NEVER multiple assertions in waitFor
await waitFor(() => {
  expect(mockFn).toHaveBeenCalled();
  expect(screen.getByText(/done/i)).toBeVisible(); // Slower failures
});
```

---

## Mocking

```typescript
// Basic mock
const handleClick = vi.fn();

// Mock with return value
const fetchUser = vi.fn().mockResolvedValue({ name: "John" });

// Always clean up
afterEach(() => {
  vi.restoreAllMocks();
});
```

### vi.spyOn vs vi.mock

| Method | When to Use |
|--------|-------------|
| `vi.spyOn` | Observe without replacing (PREFERRED) |
| `vi.mock` | Replace entire module (use sparingly) |

---

## Common Matchers

```typescript
// Presence
expect(element).toBeInTheDocument();
expect(element).toBeVisible();

// State
expect(button).toBeDisabled();
expect(input).toHaveValue("text");
expect(checkbox).toBeChecked();

// Content
expect(element).toHaveTextContent(/hello/i);
expect(element).toHaveAttribute("href", "/home");

// Functions
expect(fn).toHaveBeenCalledWith(arg1, arg2);
expect(fn).toHaveBeenCalledTimes(2);
```

---

## What NOT to Test

```typescript
// āŒ Internal state
expect(component.state.isLoading).toBe(true);

// āŒ Third-party libraries
expect(axios.get).toHaveBeenCalled();

// āŒ Static content (unless conditional)
expect(screen.getByText("Welcome")).toBeInTheDocument();

// āœ… User-visible behavior
expect(screen.getByRole("button")).toBeDisabled();
```

---

## File Organization

```
components/
ā”œā”€ā”€ Button/
│   ā”œā”€ā”€ Button.tsx
│   ā”œā”€ā”€ Button.test.tsx    # Co-located
│   └── index.ts
```

---

## Commands

```bash
pnpm test                    # Watch mode
pnpm test:run               # Single run
pnpm test:coverage          # With coverage
pnpm test Button            # Filter by name
```

Signals

Avg rating⭐ 0.0
Reviews0
Favorites0

Information

Repository
prowler-cloud/prowler
Author
prowler-cloud
Last Sync
3/12/2026
Repo Updated
3/12/2026
Created
2/3/2026

Reviews (0)

No reviews yet. Be the first to review this skill!