본문 바로가기
프론트엔드/단위 테스트

모의(Mock) 함수

by step 1 2022. 1. 20.
반응형

단위 테스트는 최소한의 단위를 최소한의 시간을 드려서 하는게 좋다

따라서 시간이 걸리는 로직을 단순화 시키는데 이때 사용 되는것이 모의 함수 이다.

 

기존 코드

example.js

// export 키워드를 붙여서 외부에서 테스트할수 있도록 설정

export function double(num) {
  // num 데이터가 없는 경우
  if(!num) {
    return 0
  }
  return num * 2
}

// 기본값은 최대 5초 따라서 그 이상은 test코드 부분에서 설정해주어야 한다.
export function asyncFn() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve('Done!')
    }, 5000) 
  })
}

example.test.js

import { asyncFn } from './example';

describe('비동기 테스트', () => {
  test('async/await', async () => {
    const res = await asyncFn()
    expect(res).toBe('Done?')
  }, 7000)
})

 

모의함수로 변경

example.test.js

import * as example from './example';

describe('비동기 테스트', () => {
  test('async/await', async () => {
    // 모의함수
    jest.spyOn(example, 'asyncFn').mockResolvedValue('Done!')
    const res = await example.asyncFn()
    expect(res).toBe('Done!')
  }, 7000)
})

결과 확인 -> 시간이 단축된것을 확인할 수 있다.

 

영화검색및 문자변경 테스트 예제

example.js 파일에 함수 추가

import axios from 'axios'
import _upperFirst from 'lodash/upperFirst'
import _toLower from 'lodash/toLower'

export async function fetchMovieTitle() {
  // 겨울왕국2 데이터 가져오기
  const res = await axios.get('https://omdbapi.com?apikey=7035c60c&i=tt4520988')
  return _upperFirst(_toLower(res.data.Title))  // Frozen II => Frozen ii

}

 

example.test.js

import axios from 'axios'
import { fetchMovieTitle } from './example'

describe('비동기 테스트', () => {
  test('영화 제목 변환', async () => {
    // 모의 함수 생성
    axios.get = jest.fn(() => {
      return new Promise(resolve => {
        resolve({
          // 모의 데이터 생성
          data: {
            Title: 'Frozen II'
          }
        })
      })
    })
    const title = await fetchMovieTitle()
    expect(title).toBe('Frozen ii')
  })
})

네트워크 연결을 끊은상태에서 주석처리를 안하면 정상처리 가능

모의 함수를 주석 처리 하고 연결을 끊으면 실패

반응형

'프론트엔드 > 단위 테스트' 카테고리의 다른 글

VTU API 공식 문서 사이트  (0) 2022.01.23
VTU 첫 테스트 및 에러 해결(버전 문제)  (0) 2022.01.21
비동기 테스트  (0) 2022.01.19
Jest Matchers 이해  (0) 2022.01.18
Jest Globals  (0) 2022.01.17