---
name: Unit Testing (Vitest)
description: A guide for writing unit tests using Vitest
---

# Unit Testing with Vitest

이 스킬은 **Vitest**를 사용하여 단위 테스트를 작성하고 실행하는 방법을 안내합니다.

## 1. 기본 원칙 (TDD 권장)
- **Red**: 실패하는 테스트를 먼저 작성합니다. (요구사항 정의)
- **Green**: 테스트를 통과하는 최소한의 코드를 작성합니다.
- **Refactor**: 코드를 개선합니다.

> [!IMPORTANT]
> **요구사항 기반 테스트 작성**: 테스트 시나리오는 반드시 **요구사항(PRD)**을 최우선으로 하여 작성해야 합니다. 이미 작성된 코드를 분석하여 테스트 케이스를 끼워 맞추지 마세요. 코드가 없더라도 요구사항에 명시된 동작이 올바른지 검증하는 것이 테스트의 본질입니다.

## 2. 테스트 파일 위치
- 테스트 파일은 대상 파일과 **동일한 디렉토리**에 위치하거나 `__tests__` 디렉토리에 위치해야 합니다.
- 파일명 규칙: `[filename].test.ts` 또는 `[filename].spec.ts`

## 3. 테스트 구조 예시
```typescript
import { describe, it, expect, vi } from 'vitest';
import { targetFunction } from './target-file';

describe('targetFunction', () => {
  it('should return correct value under condition A', () => {
    // Arrange (준비)
    const input = ...;
    
    // Act (실행)
    const result = targetFunction(input);
    
    // Assert (검증)
    expect(result).toBe(...);
  });

  it('should throw error when input is invalid', () => {
    expect(() => targetFunction(invalidInput)).toThrow();
  });
});
```

## 4. 모킹 (Mocking)
- 외부 의존성(DB, API 등)은 반드시 Mocking 하여 순수 로직만 테스트합니다.
```typescript
vi.mock('./dependency', () => ({
  dependencyFunction: vi.fn(),
}));
```

## 5. 실행 방법
- 전체 테스트: `npm run test` (또는 `npx vitest`)
- 특정 파일: `npx vitest [filename]`
- 변경 감지 모드: `npx vitest watch`

## 6. 주의사항
- 테스트는 **독립적**이어야 합니다. 다른 테스트의 상태에 의존하지 마세요.
- 테스트 커버리지를 맹신하지 말고, **경계값(Boundary Value)**과 **예외 케이스**를 중점적으로 테스트하세요.
