단위 테스트를 작성할 때, 종종 테스트 대상 코드와 외부 의존성 사이를 분리해야 합니다. 이를 위해 테스트 더블을 사용하는데, 테스트 더블에는 몇 가지 모델이 있습니다. 이 글에서는 스파이, 모의 객체, 프록시, 테스트 더미 등의 다양한 테스트 더블 모델을 선택하는 방법을 타입스크립트 환경에서 다루어보겠습니다.
1. 스파이(Spy)
스파이는 메서드가 호출될 때마다 그 정보를 저장하거나 코드 실행 여부를 확인하는 데 사용됩니다. 타입스크립트에서는 sinon
라이브러리를 이용하여 스파이를 만들 수 있습니다. 아래는 sinon
을 사용한 스파이 예시입니다.
import * as sinon from 'sinon';
// 스파이 생성
const mySpy = sinon.spy();
// 호출 여부 확인
mySpy();
console.log(mySpy.called); // true
2. 모의 객체(Mock)
모의 객체는 실제 메서드 호출 대신 미리 정의된 동작을 수행합니다. 타입스크립트에서는 jest
나 ts-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 페이지
이제 알아보았듯이, 타입스크립트 단위 테스트를 작성할 때, 올바른 테스트 더블 모델을 선택하는 것이 중요합니다. 각 모델의 특징과 사용 사례에 대해 알고 있다면, 더욱 효과적으로 단위 테스트를 작성할 수 있을 것입니다.