자바스크립트 TDD에서의 Mocking과 스텁 활용하기

목차

Mocking이란?

Mocking은 테스트 중에 필요한 객체를 가짜로 만들어 실제 객체처럼 동작하도록 하는 것입니다. 실제 객체를 사용하지 않고 Mock 객체를 사용하여 의존성을 분리하고, 테스트의 안정성을 높일 수 있습니다.

스텁이란?

스텁은 특정 함수의 호출에 대한 원하는 결과를 반환하는 것입니다. 특정 상황에서 함수의 반환값 또는 동작을 정의할 때 사용됩니다. 스텁은 테스트에 필요한 가짜 동작을 정의하여 테스트를 더욱 쉽고 정확하게 만들어 줍니다.

자바스크립트 TDD에서의 Mocking

자바스크립트 TDD에서 Mocking을 활용하면 테스트 중에 외부 환경에 의존하지 않고 코드를 테스트할 수 있습니다. 이를 통해 테스트의 안정성을 높일 수 있고, 테스트를 더욱 쉽게 작성할 수도 있습니다.

Jest를 이용한 Mocking

Jest는 자바스크립트용 유닛 테스트 프레임워크로, Mocking을 쉽게 구현할 수 있는 기능을 제공합니다. 아래는 Jest를 활용한 Mocking의 예시입니다.

// UserService.js
class UserService {
  async getUser(userId) {
    // 실제로 외부 API를 호출하여 사용자 정보를 가져옴
    return await fetch(`https://api.example.com/users/${userId}`);
  }
}

// UserService.test.js
const fetch = require("node-fetch");
const UserService = require("./UserService");

jest.mock("node-fetch");

test("getUser 함수가 올바르게 동작하는지 테스트", async () => {
  const mockResponse = {
    id: 123,
    name: "John Doe",
    email: "john.doe@example.com",
  };

  fetch.mockResolvedValue({
    json: jest.fn().mockResolvedValue(mockResponse),
  });

  const userService = new UserService();
  const user = await userService.getUser(123);

  expect(user).toEqual(mockResponse);
});

위의 예시에서는 Node.js의 node-fetch 모듈을 Mocking하여 실제 API 호출 없이 테스트를 진행하고 있습니다. fetch.mockResolvedValue()를 사용하여 원하는 응답을 설정할 수 있습니다. 이를 통해 외부 의존성 없이 getUser 함수를 테스트할 수 있습니다.

자바스크립트 TDD에서의 스텁

자바스크립트 TDD에서 스텁을 활용하면 원하는 동작을 가진 가짜 함수를 사용하여 코드를 테스트할 수 있습니다. 특정 상황에서 함수의 동작을 정의하여 테스트를 더욱 쉽고 정확하게 만들어 줍니다.

Sinon을 이용한 스텁

Sinon은 자바스크립트용 mocking 라이브러리로, 스텁을 쉽게 구현할 수 있습니다. 아래는 Sinon을 활용한 스텁의 예시입니다.

// MathUtils.js
class MathUtils {
  add(a, b) {
    // 두 수를 더한 결과 반환
    return a + b;
  }
}

// MathUtils.test.js
const sinon = require("sinon");
const MathUtils = require("./MathUtils");

test("add 함수가 올바르게 동작하는지 테스트", () => {
  const mathUtils = new MathUtils();
  const stub = sinon.stub(mathUtils, "add");

  stub.withArgs(2, 3).returns(5);

  const result = mathUtils.add(2, 3);

  expect(result).toBe(5);

  stub.restore();
});

위의 예시에서는 Sinon의 stub을 사용하여 add 함수의 동작을 원하는대로 정의하고 있습니다. stub.withArgs()를 사용하여 특정 인수에 대한 반환값을 설정할 수 있으며, stub.restore()를 사용하여 원래 함수로 복구할 수 있습니다.

결론

자바스크립트 TDD에서 Mocking과 스텁은 테스트의 안정성과 정확성을 높이고, 외부 의존성을 제거하여 테스트의 효율성을 높이는데 도움을 줍니다. Jest와 Sinon과 같은 라이브러리를 활용하여 Mocking과 스텁을 구현할 수 있으므로, 이를 적절히 활용하여 효과적인 TDD를 진행해 보세요.

참고 자료