상세 컨텐츠

본문 제목

jest에서 테스트 함수의 내부 모듈 함수 mock하기

언어/Javascript + Typescript

by moonionn 2021. 11. 20. 02:50

본문

Jest

테스트코드의 소중함을 절실하게 느끼는 요즘... 그만큼 테스트코드 짜는 일도 많아졌습니다.

테스트코드를 작성하면서 다양한 상황을 마주하는데요,

그중 처음 만났을때 가장 당혹스러운 경우는 바로 import해서 쓰고 있는 함수를 mock하는 법입니다.

(그러니까... 테스트하고자 하는 함수가 다른 모듈에서 불러와 사용하고 있는 함수)

 

거두절미하고 바로 예시를 봅시다.

여기 외부 세계 서버와 소통하는 module.js 파일 내의 getByCallExternalApi 함수가 있습니다.

그리고 myGet.js 파일 내의 get 이라는 함수가 해당 함수를 불러와 사용하고 있는 상황입니다.

// module.js

const { callExternalApi } = require('./api');

const getByCallExternalApi = () => {
  return callExternalApi();
};

module.exports = { getByCallExternalApi };
// myGet.js

const { getByCallExternalApi } = require('module'); // or require('../module'), by any means...

const get = () => {
  return getByCallExternalApi();
};

module.exports = { get };

 

이제 테스트코드를 짜봅시다.

// myGet.spec.js

describe('get', () => {
  const { get } = require('./myGet');
  const { getByCallExternalApi } = require('module');
  
  // mock!!!!
  jest.mock('module');
  getByCallExternalApi.mockReturnValueOnce('test return value');

  it('should succeed', () => {
    const result = get();
    
    expect(result).toBe('test return value');
    expect(getByCallExternalApi.mock.calls.length).toBe(1);
  });
  
  it('should fail', () => {
    const result = get(); // failed result
    expect(getByCallExternalApi.mock.calls.length).toBe(1); 
    //👆🏻이번엔 실패했으므로 여전히 총 1번밖에 불리지 않음
  });
});

 

 

관련글 더보기

댓글 영역