🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

Factory Pattern 테스트 전략 완벽 가이드 - 슬라이드 1/13
A

AI Generated

2025. 11. 5. · 10 Views

Factory Pattern 테스트 전략 완벽 가이드

Factory Pattern을 효과적으로 테스트하는 방법을 다룹니다. Mock 객체 활용, 의존성 주입, 테스트 더블 패턴 등 실전 테스트 전략을 학습합니다.


카테고리:TypeScript
언어:TypeScript
메인 태그:#TypeScript
서브 태그:
#FactoryPattern#Testing#Mock#DependencyInjection

들어가며

이 글에서는 Factory Pattern 테스트 전략 완벽 가이드에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. Factory_인터페이스_테스트
  2. Mock_Factory_패턴
  3. Factory_메소드_파라미터_검증
  4. 에러_처리_테스트
  5. Test_Double_Factory
  6. Factory_상태_검증
  7. 의존성_주입_테스트
  8. Abstract_Factory_테스트
  9. Factory_성능_테스트
  10. Factory_Registry_테스트
  11. Spy_패턴_활용
  12. 통합_테스트_전략

1. Factory 인터페이스 테스트

개요

Factory의 계약(Contract)을 검증하여 모든 구현체가 올바른 타입의 객체를 반환하는지 확인합니다.

코드 예제

interface PaymentFactory {
  create(type: string): Payment;
}

test('factory returns correct payment type', () => {
  const factory = new ConcretePaymentFactory();
  const payment = factory.create('credit');
  expect(payment).toBeInstanceOf(CreditPayment);
});

설명

Factory 인터페이스의 계약을 테스트하여 타입 안정성을 보장합니다. 반환 타입과 인스턴스를 검증합니다.


2. Mock Factory 패턴

개요

실제 Factory 대신 Mock을 사용하여 의존성을 격리하고 단위 테스트를 작성합니다.

코드 예제

class MockPaymentFactory implements PaymentFactory {
  create = jest.fn().mockReturnValue({
    process: jest.fn().mockResolvedValue(true)
  });
}

test('service uses factory correctly', async () => {
  const mockFactory = new MockPaymentFactory();
  const service = new PaymentService(mockFactory);
  await service.processPayment('credit', 100);
  expect(mockFactory.create).toHaveBeenCalledWith('credit');
});

설명

Mock Factory를 주입하여 실제 생성 로직 없이 Factory 사용 패턴을 검증합니다.


3. Factory 메소드 파라미터 검증

개요

Factory가 다양한 파라미터 조합에 대해 올바른 객체를 생성하는지 테스트합니다.

코드 예제

describe('Factory parameter validation', () => {
  const factory = new PaymentFactory();

  test.each([
    ['credit', CreditPayment],
    ['debit', DebitPayment],
    ['crypto', CryptoPayment]
  ])('creates %s payment', (type, expectedClass) => {
    expect(factory.create(type)).toBeInstanceOf(expectedClass);
  });
});

설명

파라미터화된 테스트로 다양한 입력에 대한 Factory의 동작을 효율적으로 검증합니다.


4. 에러 처리 테스트

개요

Factory가 잘못된 입력에 대해 적절한 예외를 발생시키는지 확인합니다.

코드 예제

test('factory throws on invalid type', () => {
  const factory = new PaymentFactory();

  expect(() => {
    factory.create('invalid_type');
  }).toThrow('Unknown payment type: invalid_type');
});

설명

Factory의 에러 처리 로직을 테스트하여 예외 상황에서의 안정성을 보장합니다.


5. Test Double Factory

개요

테스트를 위한 전용 Factory를 만들어 테스트 데이터 생성을 간소화합니다.

코드 예제

class TestPaymentFactory extends PaymentFactory {
  createWithDefaults(type: string) {
    const payment = this.create(type);
    payment.amount = 100;
    payment.currency = 'USD';
    return payment;
  }
}

test('test factory provides defaults', () => {
  const factory = new TestPaymentFactory();
  const payment = factory.createWithDefaults('credit');
  expect(payment.amount).toBe(100);
});

설명

테스트 전용 Factory로 기본값이 설정된 객체를 쉽게 생성하여 테스트 코드를 간결하게 만듭니다.


6. Factory 상태 검증

개요

Factory가 내부 상태를 올바르게 관리하는지 테스트합니다(Singleton Factory 등).

코드 예제

test('singleton factory returns same instance', () => {
  const factory = SingletonFactory.getInstance();
  const instance1 = factory.create('logger');
  const instance2 = factory.create('logger');

  expect(instance1).toBe(instance2);
});

설명

Singleton 패턴이 적용된 Factory의 경우 인스턴스 재사용을 검증합니다.


7. 의존성 주입 테스트

개요

Factory가 의존성을 올바르게 주입하여 객체를 생성하는지 확인합니다.

코드 예제

test('factory injects dependencies', () => {
  const mockLogger = { log: jest.fn() };
  const factory = new PaymentFactory({ logger: mockLogger });
  const payment = factory.create('credit');

  payment.process();
  expect(mockLogger.log).toHaveBeenCalled();
});

설명

Factory가 생성하는 객체에 의존성이 올바르게 주입되는지 검증합니다.


8. Abstract Factory 테스트

개요

Abstract Factory 패턴에서 Factory Family의 일관성을 테스트합니다.

코드 예제

test('factory family maintains consistency', () => {
  const iosFactory = new IOSUIFactory();
  const button = iosFactory.createButton();
  const input = iosFactory.createInput();

  expect(button.getTheme()).toBe('ios');
  expect(input.getTheme()).toBe('ios');
});

설명

Abstract Factory가 생성하는 모든 제품이 동일한 Family에 속하는지 확인합니다.


9. Factory 성능 테스트

개요

Factory의 객체 생성 성능과 메모리 효율성을 측정합니다.

코드 예제

test('factory creates objects efficiently', () => {
  const factory = new PaymentFactory();
  const start = performance.now();

  for (let i = 0; i < 1000; i++) {
    factory.create('credit');
  }

  const duration = performance.now() - start;
  expect(duration).toBeLessThan(100);
});

설명

대량의 객체 생성 시 Factory의 성능을 측정하여 병목을 식별합니다.


10. Factory Registry 테스트

개요

Registry 패턴을 사용하는 Factory의 등록/조회 메커니즘을 테스트합니다.

코드 예제

test('factory registry manages creators', () => {
  const registry = new FactoryRegistry();
  registry.register('custom', CustomPaymentCreator);

  const factory = new PluggableFactory(registry);
  const payment = factory.create('custom');

  expect(payment).toBeInstanceOf(CustomPayment);
});

설명

동적으로 Creator를 등록하고 사용하는 Registry 기반 Factory를 테스트합니다.


11. Spy 패턴 활용

개요

Spy를 사용하여 Factory 메소드 호출을 추적하고 검증합니다.

코드 예제

test('tracks factory method calls', () => {
  const factory = new PaymentFactory();
  const createSpy = jest.spyOn(factory, 'create');

  const service = new PaymentService(factory);
  service.processMultiple(['credit', 'debit']);

  expect(createSpy).toHaveBeenCalledTimes(2);
});

설명

Spy 패턴으로 Factory 메소드가 올바른 횟수와 순서로 호출되는지 검증합니다.


12. 통합 테스트 전략

개요

Factory를 포함한 전체 시스템의 통합 테스트를 작성합니다.

코드 예제

test('end-to-end factory integration', async () => {
  const factory = new PaymentFactory();
  const service = new PaymentService(factory);
  const gateway = new PaymentGateway(service);

  const result = await gateway.checkout({
    type: 'credit',
    amount: 100
  });

  expect(result.success).toBe(true);
});

설명

Factory가 실제 애플리케이션 흐름에서 올바르게 동작하는지 통합 테스트로 검증합니다.


마치며

이번 글에서는 Factory Pattern 테스트 전략 완벽 가이드에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.

관련 태그

#TypeScript #FactoryPattern #Testing #Mock #DependencyInjection

#TypeScript#FactoryPattern#Testing#Mock#DependencyInjection

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.

함께 보면 좋은 카드 뉴스

마이크로서비스 배포 완벽 가이드

Kubernetes를 활용한 마이크로서비스 배포의 핵심 개념부터 실전 운영까지, 초급 개발자도 쉽게 따라할 수 있는 완벽 가이드입니다. 실무에서 바로 적용 가능한 배포 전략과 노하우를 담았습니다.

Spring Boot 상품 서비스 구축 완벽 가이드

실무 RESTful API 설계부터 테스트, 배포까지 Spring Boot로 상품 서비스를 만드는 전 과정을 다룹니다. JPA 엔티티 설계, OpenAPI 문서화, Docker Compose 배포 전략을 초급 개발자도 쉽게 따라할 수 있도록 스토리텔링으로 풀어냅니다.

단위 테스트와 통합 테스트 완벽 가이드

테스트 코드 작성이 처음이라면 이 가이드로 시작하세요. JUnit 5 기초부터 Mockito, MockMvc, SpringBootTest, Testcontainers까지 실무에서 바로 쓸 수 있는 테스트 기법을 단계별로 배웁니다.

Application Load Balancer 완벽 가이드

AWS의 Application Load Balancer를 처음 배우는 개발자를 위한 실전 가이드입니다. ALB 생성부터 ECS 연동, 헬스 체크, HTTPS 설정까지 실무에 필요한 모든 내용을 다룹니다. 초급 개발자도 쉽게 따라할 수 있도록 단계별로 설명합니다.

고객 상담 AI 시스템 완벽 구축 가이드

AWS Bedrock Agent와 Knowledge Base를 활용하여 실시간 고객 상담 AI 시스템을 구축하는 방법을 단계별로 학습합니다. RAG 기반 지식 검색부터 Guardrails 안전 장치, 프론트엔드 연동까지 실무에 바로 적용 가능한 완전한 시스템을 만들어봅니다.