[javascript] Jest에서의 모듈 간 의존성 해결 방법은 어떻게 되는가?

Jest는 JavaScript 테스트 프레임워크로, 모듈 간의 의존성을 해결하는 방법에 대한 여러 가지 옵션이 있습니다. 이 글에서는 Jest에서 모듈 간 의존성을 해결하기 위해 가장 일반적으로 사용되는 방법에 대해 설명하겠습니다.

Mocking을 사용한 모듈 의존성 해결

Jest에서는 모듈 간의 의존성을 가장 쉽게 해결할 수 있는 방법으로 Mocking을 사용하는 것입니다. Mocking은 제품 코드의 모듈에 대한 가짜(mock) 모듈을 생성하여 테스트에서 사용하는 방법입니다.

아래는 모듈 의존성을 가지고 있는 파일의 예시입니다.

// dependency.js
export function fetchData() {
  // ...
}

// main.js
import { fetchData } from './dependency.js';

export function getData() {
  const data = fetchData();
  // ...
  return data;
}

이제 Jest를 사용하여 getData 함수를 테스트해보겠습니다.

// main.test.js
import { getData } from './main.js';

import { fetchData } from './dependency.js';

jest.mock('./dependency.js', () => ({
  fetchData: jest.fn(),
}));

test('getData 함수가 fetchData 함수를 호출하는지 확인', () => {
  getData();
  expect(fetchData).toHaveBeenCalled();
});

위 예시에서는 dependency.js 파일을 가장 상단에서 jest.mock 함수를 사용하여 모킹합니다. 그리고 jest.fn()을 사용하여 fetchData 함수를 가짜로 만듭니다.

이제 테스트에서 getData를 호출할 때, fetchData 함수가 호출되는지 확인할 수 있습니다.

실제 의존성을 사용하는 모듈 테스트

만약 위의 예시처럼 getData 함수 내부에서 외부 모듈의 결과에 따라 다른 로직을 실행해야 한다면, 실제 모듈 의존성을 사용해야 할 수도 있습니다. 이럴 때에는 mocking 대신 실제 모듈을 사용하여 테스트를 진행합니다.

다음은 dependency.js 파일과 main.js 파일의 조금 수정된 예시입니다.

// dependency.js
export function fetchData() {
  return fetch('https://api.example.com/data')
    .then(response => response.json());
}

// main.js
import { fetchData } from './dependency.js';

export async function getData() {
  const data = await fetchData();
  if (data && data.success) {
    // ...
    return data;
  } else {
    // ...
    return null;
  }
}

모듈 의존성을 사용하는 main.js 파일을 Jest로 테스트하기 위해서는 실제 네트워크 요청이 이루어지는 fetchData 함수가 호출되도록 해야 합니다.

// main.test.js
import { getData } from './main.js';

test('getData 함수가 fetch를 호출하는지 확인', async () => {
  const data = await getData();
  expect(data).not.toBeNull(); // 실제 응답이 null이 아닌지 확인
});

테스트에서는 getData 함수를 호출하고, 실제 응답이 null이 아님을 확인합니다.

이처럼 Jest에서 모듈 간 의존성을 해결하기 위해서는 Mocking 또는 실제 모듈을 사용하여 테스트할 수 있습니다. Mocking은 간단하지만 기능이 제한적이고, 실제 의존성을 사용하는 테스트는 더 복잡하지만 더 실제적인 상황을 테스트할 수 있습니다. 적절한 상황에 맞게 선택하여 Jest 테스트를 작성해보세요.