테스트/단위 테스트 (Vue)

단위 테스트 - 모의(Mock) 함수

IT Blue 2021. 9. 5. 00:22

 

단위 테스트 - 모의(Mock) 함수 1

 

비동기함수

/* example.js	*/
export function asyncFn() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('Done!')
    }, 6000)
  })
}

 

테스트

/*	example.test.js	*/

import * as example from './example'

describe('비동기 테스트', () => {
  test('async/await', async () => {
    // jest.spyOn(객체명, 메소드명)
    // asyncFn() 비동기 함수를 모의 함수로 만듬
    // mockReselvedValue() 비동기로 실행이 되면 데이터를 반환
    jest.spyOn(example, 'asyncFn')
      .mockResolvedValue('Done!')
    const res = await example.asyncFn()
    expect(res).toBe('Done!')
  }, 7000)
})

 

- asyncFn() 함수는 6초 뒤에 데이터를 반환

- 테스트는 asyncFn() 함수를 기다리느라 최소 6초가 넘어가게 된다 (불필요)

- 모의 함수를 만들면 asyncFn() 함수를 모의로 만들어서 원하는 데이터만 반환

- 기다리지 않고 테스트를 진행할 수 있다

 

단위 테스트 - 모의(Mock) 함수 2

 

비동기함수

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

export async function fetchMovieTitle() {
  const res = await axios.get('https://omdbapi.com?apikey=...&i=tt4520988')
  return _upperFirst(_toLower(res.data.Title)) // Frozen II => Frozen ii
}

 

테스트

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

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

 

- fetchMovieTitle() 함수는 OMDB API 서버에서 영화 정보를 받아서 데이터를 가공 후 리턴

- 테스트는 실제 서버에 요청하는 부분까지 작성할 필요가 없다 (불필요)

- 서버에서 데이터를 가져오지 못하는 경우에는 테스트를 진행할 수 없게 된다

- 모의 함수를 만들어서 API 서버에서 받아오는 것과 동일한 결과값을 반환

- 서버에서 데이터를 가져오지 못하는 경우에도 테스트를 진행할 수 있게 된다