[typescript] 타입스크립트 단위 테스트 작성 시 모의 객체 라이브러리 소개

타입스크립트로 코드를 작성하다보면 단위 테스트를 위해 모의 객체(mocks)를 사용해야할 때가 있습니다. 모의 객체는 실제 객체를 대신하여 동작을 모방하거나 흉내 내는데 사용됩니다.

이번 글에서는 타입스크립트에서 주로 사용되는 모의 객체 라이브러리 몇 가지를 소개하고, 간단한 예제를 통해 어떻게 사용하는지 살펴보겠습니다.

목차

  1. Jest
  2. Sinon
  3. TypeMoq

Jest

Jest는 페이스북에서 만든 테스팅 프레임워크로, 모의 객체 라이브러리를 기본으로 제공합니다. Jest는 간단하고 직관적인 API를 제공하여 쉽게 모의 객체를 생성하고 관리할 수 있습니다.

import { myFunction } from './myModule';

jest.mock('./myModule', () => {
  return {
    myFunction: jest.fn(() => 'Mocked result')
  };
});

test('mock myFunction', () => {
  expect(myFunction()).toEqual('Mocked result');
});

Sinon

Sinon은 스파게티 코드를 잘게 썰어낸 모의객체 라이브러리로 유명합니다. Sinon은 스파이, 스텁, 모의 객체 등을 지원하며 타이머, HTTP 요청 등의 동작을 가짜로 대체하여 테스트하는데 유용합니다.

import sinon from 'sinon';
import { myFunction } from './myModule';

test('mock myFunction', () => {
  const mock = sinon.stub(myModule, 'myFunction').returns('Mocked result');

  expect(myFunction()).toEqual('Mocked result');

  mock.restore();
});

TypeMoq

TypeMoq는 타입스크립트에서 Moq 라이브러리를 사용할 수 있도록 하는 라이브러리입니다. Moq는 .NET 개발에서 널리 사용되는 모의 객체 라이브러리로, TypeMoq를 사용하면 비슷한 방식으로 모의 객체를 생성하고 사용할 수 있습니다.

import { Mock, It, Times } from 'typemoq';
import { MyInterface } from './myModule';

let mock = Mock.ofType<MyInterface>();
mock.setup(x => x.myFunction(It.isAny())).returns(() => 'Mocked result');

test('mock myFunction', () => {
  expect(mock.object.myFunction('someParam')).toEqual('Mocked result');
});

위에서는 Jest, Sinon, TypeMoq를 사용한 간단한 모의 객체 예제를 살펴보았습니다. 각 라이브러리는 고유한 특징과 장단점을 가지고 있으니, 프로젝트의 요구사항과 개발팀 구성원들의 취향에 맞게 선택하여 사용하면 됩니다.