[typescript] 타입스크립트 단위 테스트 작성 시 스턴트 더블(Stub Double) 패턴 활용 방법

단위 테스트를 작성할 때, 종속성을 제거하고 테스트를 독립적으로 수행하기 위해 스턴트 더블(Stub Double) 패턴을 활용할 수 있습니다. 이 패턴은 외부 리소스, 서비스, 또는 모듈을 대체하여 실제 동작을 모방하는 가짜 구현체를 제공합니다.

스턴트 더블 패턴에는 테스트 스텁(Stub)테스트 스파이(Spy)가 있습니다. 테스트 스텁은 예상되는 결과를 반환하는 반면, 테스트 스파이는 호출 정보를 기록하고 분석합니다.

테스트 스텁(Stub) 작성

아래는 타입스크립트에서 테스트 스텁을 작성하는 간단한 예제입니다.

// FileService.ts
export class FileService {
  static read(fileName: string): Promise<string> {
    // 파일을 읽는 비동기 동작을 수행하는 메서드
  }
}

// FileServiceStub.ts
export class FileServiceStub {
  static read(fileName: string): Promise<string> {
    return new Promise((resolve) => resolve("Stubbed file content"));
  }
}

위 예제에서 FileServiceStubFileService의 테스트 스텁으로, read 메서드를 대체하여 항상 Stubbed file content를 반환합니다.

테스트에서의 활용

테스트 시에는 테스트 스텁을 활용하여 외부 리소스 또는 서비스와의 종속성을 제거할 수 있습니다. 아래 예제는 테스트에서 FileServiceStub을 활용하여 특정 파일을 읽는 동작을 테스트하는 방법을 보여줍니다.

// FileService.test.ts
import { FileService } from './FileService';
import { FileServiceStub } from './FileServiceStub';

jest.mock('./FileService', () => {
  return {
    FileService: FileServiceStub
  };
});

test('Test file read', () => {
  return FileService.read('test.txt').then((content) => {
    expect(content).toBe("Stubbed file content");
  });
});

위 테스트 코드에서 FileServiceStub을 이용하여 FileService의 테스트 스텁으로 설정하고, read 메서드가 Stubbed file content를 반환하는지 확인합니다.

마무리

스턴트 더블 패턴은 단위 테스트 작성 시 외부 종속성을 관리하고 테스트의 신뢰성을 확보하는 데 유용합니다. 타입스크립트에서는 이러한 패턴을 활용하여 효율적이고 견고한 단위 테스트를 작성할 수 있습니다.

참고 자료