jest
Jest 테스트 컨벤션. __tests__/ 구조, useFakeTimers, AAA 패턴, 한글 테스트명.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Jest 테스트 컨벤션. __tests__/ 구조, useFakeTimers, AAA 패턴, 한글 테스트명.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
세션 핸드오프. 컨텍스트가 차기 전에 중요 맥락을 progress.md에 문서화하고 새 세션 킥오프 프롬프트를 클립보드에 복사한다. "핸드오프", "세션 정리하고 넘기자", "컨텍스트 정리", "이어갈 준비" 등의 요청에 사용.
MD 파일 또는 텍스트로 작업을 정의하면, 분석 → 디자인 확인 → 구현 → 검증 → 커밋 → PR까지 전체 플로우를 수행한다. "이거 만들어줘", "기능 구현해줘", "작업 시작하자", "이 티켓 진행해줘" 등 코드 작업 착수 발화에 사용.
Claude + OpenAI Codex 협업 스킬. MCP 서버 설정 시에만 사용 가능.
code-forge 상태 대시보드. REFLECT flag, quality 이벤트, notepad/decisions, usage 집계를 한 번에. forge-glow 같은 외부 도구는 --json으로 파싱.
교차 모델 토론. Agent Teams / Codex CLI / self-debate 모드 선택. 설계 결정, 아키텍처 선택 시 활용. "어느 쪽이 나을까", "설계 비교해줘", "토론시켜줘", "교차 검증해줘" 등의 요청에 사용.
화면 단위 E2E 테스트 자동화. Figma/코드 기반 테스트 케이스 도출 → Playwright 코드 생성 → Forge Loop(에스컬레이션 기반 자율 실행). "E2E 돌려줘", "화면 테스트 만들어줘", "이 페이지 자동 테스트" 등의 요청에 사용.
| name | jest |
| description | Jest 테스트 컨벤션. __tests__/ 구조, useFakeTimers, AAA 패턴, 한글 테스트명. |
순수 함수(utils, helpers, lib, adapters)에 대한 유닛 테스트 작성 규칙.
컴포넌트/훅 테스트는 assayer 에이전트가 담당한다.
utils/, helpers/, lib/, adapters/ 내 순수 함수{파일경로}/__tests__/{파일명}.test.ts
예시:
utils/period.ts → utils/__tests__/period.test.tsadapters/mapOrderToVm.ts → adapters/__tests__/mapOrderToVm.test.tsimport { 함수명 } from '../파일명';
describe('함수명', () => {
// 날짜/시간 의존 함수는 필수
beforeAll(() => {
jest.useFakeTimers().setSystemTime(new Date('2025-01-15T00:00:00.000Z'));
});
afterAll(() => {
jest.useRealTimers();
});
describe('정상 케이스', () => {
it('일반적인 입력에 대해 올바른 결과 반환', () => {
expect(함수(입력)).toEqual(기대값);
});
});
describe('경계값', () => {
it('최소값 처리', () => {});
it('최대값 처리', () => {});
it('빈 값 처리', () => {});
});
describe('에러 케이스', () => {
it('잘못된 입력 시 에러/기본값 반환', () => {});
});
});
| 카테고리 | 설명 | 예시 |
|---|---|---|
| 정상 케이스 | 일반적인 유효 입력 | getPeriod('last14Days') |
| 경계값 | 0, 빈 배열, null, undefined | formatPrice(0) |
| 에러 케이스 | 잘못된 타입, 범위 초과 | getPeriod('invalid') |
| 정책 케이스 | 비즈니스 규칙 반영 | last14Days는 14일 전부터 |
describe('getPeriod', () => {
beforeAll(() => {
jest.useFakeTimers().setSystemTime(new Date('2025-01-15T00:00:00.000Z'));
});
afterAll(() => {
jest.useRealTimers();
});
it('last14Days - 오늘 기준 14일 전부터 오늘까지', () => {
expect(getPeriod('last14Days')).toEqual(['2025-01-01', '2025-01-15']);
});
it('thisMonth - 해당 월 1일부터 말일까지', () => {
expect(getPeriod('thisMonth')).toEqual(['2025-01-01', '2025-01-31']);
});
it('lastMonth - 이전 월 1일부터 말일까지', () => {
expect(getPeriod('lastMonth')).toEqual(['2024-12-01', '2024-12-31']);
});
it('잘못된 옵션 입력 시 기본값 반환', () => {
expect(getPeriod('invalid')).toEqual(['2025-01-01', '2025-01-15']);
});
});
describe('calculateDiscount', () => {
it('정상 할인율 적용', () => {
expect(calculateDiscount(10000, 10)).toBe(9000);
});
it('0% 할인', () => {
expect(calculateDiscount(10000, 0)).toBe(10000);
});
it('100% 할인', () => {
expect(calculateDiscount(10000, 100)).toBe(0);
});
it('음수 금액 처리', () => {
expect(() => calculateDiscount(-1000, 10)).toThrow();
});
});
describe('mapOrderToVm', () => {
it('모든 필드가 있는 경우', () => {
const order = { id: '1', status: 'active', items: [...] };
expect(mapOrderToVm(order)).toEqual({
orderId: '1',
statusText: '진행중',
itemCount: 3,
});
});
it('optional 필드가 없는 경우', () => {
const order = { id: '1', status: 'active' };
expect(mapOrderToVm(order)).toEqual({
orderId: '1',
statusText: '진행중',
itemCount: 0,
});
});
it('null/undefined 입력', () => {
expect(mapOrderToVm(null)).toEqual(DEFAULT_ORDER_VM);
});
});
// describe: 함수명 또는 모듈명
describe('getPeriod', () => {
// 중첩 describe: 시나리오 그룹
describe('정상 케이스', () => {
// it: 구체적인 동작 설명 (한글 권장)
it('last14Days 옵션은 14일 전부터 오늘까지 반환', () => {});
});
});
jest.useFakeTimers() 사용# test 스크립트 확인
yarn workspace {해당앱} run | rg "^\s+test"
# 단일 파일
yarn workspace {해당앱} test -- --testPathPattern="period.test.ts"
# 전체
yarn workspace {해당앱} test
리팩토링 시 기존 동작을 보호하는 테스트:
// 현재 동작을 "캡처"
describe('기간 필터 정책 (회귀 방지)', () => {
// 이 테스트가 깨지면 = 정책이 바뀐 것
// 의도된 변경인지 확인 필요
});
jest.useFakeTimers() 사용?