원클릭으로
gen-e2e-test
Effect 기반 E2E 테스트를 프로젝트 패턴(it.effect, Layer, Effect.either)에 맞게 생성. Effect 공식문서 원칙 준수.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Effect 기반 E2E 테스트를 프로젝트 패턴(it.effect, Layer, Effect.either)에 맞게 생성. Effect 공식문서 원칙 준수.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | gen-e2e-test |
| description | Effect 기반 E2E 테스트를 프로젝트 패턴(it.effect, Layer, Effect.either)에 맞게 생성. Effect 공식문서 원칙 준수. |
| disable-model-invocation | true |
@effect/vitest의 it.effect() 패턴으로 E2E 테스트를 생성합니다.
Effect 공식문서: https://effect.website/docs/
/gen-e2e-test <ServiceName> [--methods method1,method2]
Read 도구로 서비스 구현과 기존 E2E 테스트를 읽습니다.
중요: 일부 서비스(cashService, iamService 등)는 plain vitest + async/await 패턴을 사용합니다. 기존 테스트가 있다면 해당 패턴을 따르고, 새로 작성하는 경우 아래 Effect 패턴(권장)을 사용합니다.
test/lib/test-layers.ts에서 대상 서비스의 Layer 정의 확인.
test/lib/test-layers.ts에 추가createServiceLayer는 해당 파일 내부의 비공개 헬퍼입니다. 기존 정의 옆에 추가:
export const <ServiceName>Tag = Context.GenericTag<<ServiceName>>('<ServiceName>');
export const <ServiceName>Live = createServiceLayer(
<ServiceName>Tag,
<ServiceName>,
);
import {describe, expect, it} from '@effect/vitest';
import {Effect} from 'effect';
describe('<ServiceName> E2E', () => {
it.effect('should <동작 설명>', () =>
Effect.gen(function* () {
const service = yield* <ServiceName>Tag;
const result = yield* Effect.tryPromise(() =>
service.<methodName>(),
);
expect(result).toBeDefined();
}).pipe(Effect.provide(<ServiceName>Live)),
);
});
it.effect('should handle <에러 상황> gracefully', () =>
Effect.gen(function* () {
const service = yield* <ServiceName>Tag;
const result = yield* Effect.either(
Effect.tryPromise(() =>
service.<methodName>(/* invalid args */),
),
);
expect(result._tag).toBe('Left');
if (result._tag === 'Left') {
// Effect.tryPromise는 UnknownException으로 래핑 — .error로 원본 에러 접근
expect(String(result.left.error)).toContain('예상되는 에러 메시지');
}
}).pipe(Effect.provide(<ServiceName>Live)),
);
// Effect.all은 기본 순차 실행. 병렬 실행 시 concurrency 옵션 필수
const [r1, r2] = yield* Effect.all([
Effect.tryPromise(() => service.method1()),
Effect.tryPromise(() => service.method2()),
], {concurrency: 'unbounded'});
// Effect.gen 내부에서 yield*로 사용
const sender = yield* Config.string('SOLAPI_SENDER').pipe(
Config.withDefault('01000000000'),
);
CLAUDE.md "Mandatory Validation" 순서대로 pnpm lint → pnpm test → pnpm build 실행.
기존 plain vitest 테스트를 확장하는 경우, 해당 파일의 기존 패턴을 따릅니다. 새로 작성하는 Effect 패턴 테스트의 경우:
@effect/vitest에서 import (vitest 아님)it.effect() + Effect.gen(function* () { ... }).pipe(Effect.provide(Layer)) 필수Effect.tryPromise 에러는 UnknownException — .error로 원본 접근