[typescript] 타입스크립트 단위 테스트 작성 시 테스트 더블 모델 선택 방법

단위 테스트를 작성할 때, 종종 테스트 대상 코드와 외부 의존성 사이를 분리해야 합니다. 이를 위해 테스트 더블을 사용하는데, 테스트 더블에는 몇 가지 모델이 있습니다. 이 글에서는 스파이, 모의 객체, 프록시, 테스트 더미 등의 다양한 테스트 더블 모델을 선택하는 방법을 타입스크립트 환경에서 다루어보겠습니다.

1. 스파이(Spy)

스파이는 메서드가 호출될 때마다 그 정보를 저장하거나 코드 실행 여부를 확인하는 데 사용됩니다. 타입스크립트에서는 sinon 라이브러리를 이용하여 스파이를 만들 수 있습니다. 아래는 sinon을 사용한 스파이 예시입니다.

import * as sinon from 'sinon';

// 스파이 생성
const mySpy = sinon.spy();

// 호출 여부 확인
mySpy(); 
console.log(mySpy.called); // true

2. 모의 객체(Mock)

모의 객체는 실제 메서드 호출 대신 미리 정의된 동작을 수행합니다. 타입스크립트에서는 jestts-mockito 라이브러리를 사용하여 모의 객체를 생성할 수 있습니다. 아래는 ts-mockito를 사용한 모의 객체 예시입니다.

import { mock, when, instance } from 'ts-mockito';

// 모의 객체 생성
const myMock = mock<MyClass>();
const mockInstance = instance(myMock);

// 메서드 호출 시 동작 정의
when(myMock.someMethod()).thenReturn('mocked');

// 사용 예시
console.log(mockInstance.someMethod()); // "mocked"

3. 프록시(Proxy)

프록시는 객체에 대한 인터페이스를 제공하면서, 실제 동작을 가로채거나 수정할 수 있는 기능을 제공합니다. 타입스크립트에서는 프록시 객체를 사용하여 프록시를 구현할 수 있습니다. 아래는 타입스크립트에서 클래스에 프록시를 적용하는 예시입니다.

class MyProxy {
  private realSubject: RealSubject;

  constructor() {
    this.realSubject = new RealSubject();
  }

  someMethod(): string {
    // 가로채거나 수정하여 실행
    return 'intercepted ' + this.realSubject.someMethod();
  }
}

4. 테스트 더미(Test Double)

테스트 더미는 실제 객체를 단순화된 형태로 대체하여 사용됩니다. 타입스크립트에서는 간단한 테스트 더미를 만들거나 외부 종속성을 대신할 수 있습니다. 아래는 간단한 테스트 더미 클래스의 예시입니다.

class MyDummy implements MyInterface {
  someMethod(): string {
    return 'dummy implementation';
  }
}

위에서 언급된 다양한 테스트 더블 모델은 상황에 맞게 선택되어야 합니다. 스파이, 모의 객체, 프록시, 테스트 더미 중 어떤 것이 가장 적합한지는 테스트하는 코드의 목적과 환경에 따라 다를 수 있습니다.

이상으로 타입스크립트 환경에서 테스트 더블 선택하는 방법에 대해 알아보았습니다.

참고문헌:
sinon 공식 문서
ts-mockito GitHub 페이지


이제 알아보았듯이, 타입스크립트 단위 테스트를 작성할 때, 올바른 테스트 더블 모델을 선택하는 것이 중요합니다. 각 모델의 특징과 사용 사례에 대해 알고 있다면, 더욱 효과적으로 단위 테스트를 작성할 수 있을 것입니다.