jest
Jest 테스트 컨벤션. __tests__/ 구조, useFakeTimers, AAA 패턴, 한글 테스트명.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Jest 테스트 컨벤션. __tests__/ 구조, useFakeTimers, AAA 패턴, 한글 테스트명.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
세션 핸드오프. 컨텍스트가 차기 전에 중요 맥락을 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() 사용?