Woozy_DevLog
article thumbnail
Published 2023. 3. 21. 21:43
Carryduo 테스트코드 Project/Carryduo

Error 테스트 하기

champ의 데이터를 제공하는 api에서 데이터베이스에 존재하지 않는 챔피언id로 요청을 보낼 경우에 대한 예외처리를 테스트를 작성한다.

it('getTargetChampion은 존재하지 않는 챔피언id를 받으면 error return?', async () => {
    let error = null;
    const Param = {
      champId: '4',
      position: 'default',
    };
    try {
      await service.getTargetChampion(Param);
    } catch (err) {
      error = err;
    }
    expect(error).not.toBeNull();
  });

try catch 문을 이용하여 error가 발생했는지 여부를 not.tobeNull() 메서드로 확인 할 수 있었다.

axios 테스트 하기

axios로 라이엇에서 데이터를 받는 로직을 테스트 하기 위해 직접적인 외부 api 요청이 가지 않게 axios 모킹하여 테스트를 작성한다.

axios mocking 하기

it('requestRiotSummonerApi?', async () => {
    const summonerName = '할배탈';
    const request = jest.spyOn(axios, 'get');

    request.mockImplementation(async (url) => {
      switch (url) {
        case `https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/${encodeURIComponent(summonerName)}?api_key=${configService.get('RIOT_API_KEY')}`:
          return summonerData;

        case `https://kr.api.riotgames.com/lol/league/v4/entries/by-summoner/${summonerData.data.id}?api_key=${configService.get('RIOT_API_KEY')}`:
          return summonerLeagueInfoData;

        case `https://kr.api.riotgames.com/lol/champion-mastery/v4/champion-masteries/by-summoner/${summonerData.data.id}/top?count=3&api_key=${configService.get('RIOT_API_KEY')}`:
          return mostChampsData;
      }
    });
    const result = await service.requestRiotSummonerApi(summonerName);
    const response = plainToInstance(CreateSummonerDto, summonerDto);

    expect(result).toEqual(response);
  });

먼저 aixos 패키지를 import 후 const request = jest.spyOn(axios, 'get') spyOn 함수를 이용하여 axios를 모킹 한 후 mockImplementation을 이용해 해당 axios.get() 함수의 로직을 재설정 하여 특정 url에 따라 return 할 데이터를 각각 지정하였다.

특정 함수의 실행 횟수 확인하여 테스트하기

챔피언의 포지션 별 데이터를 제공하는 api에서 파라미터값이 default로 올 경우 특정 챔피언의 모스트 포지션을 찾기 위해 getMostPosition 함수가 실행된다.

 

파라미터 값이 top, mid, jungle 등 포지션 정보가 존재하는 경우에는 getMonstPosition 함수는 실행되지 않고 해당 파라미터 포지션정보를 통해 DB에서 데이터를 조회하는 로직을 테스트 하려 한다.

it('getTargetChampion에서 포지션 파라미터가 default인 경우 mostPosition을 찾는가?', async () => {
    const version = '13.1.';

    const Param = {
      champId: '1',
      position: 'default',
    };

    const positionList = {
      top: 'TOP',
      jungle: 'JUNGLE',
      mid: 'MIDDLE',
      ad: 'BOTTOM',
      support: 'UTILITY',
      default: 'default position',
    };

    let getMostPosition = jest.spyOn(repository, 'getMostPosition').mockImplementation(async (champId: string, version: string) => {
      const positionInfo = [
        { champId: '1', position: 'JUNGLE', version: '13.1.' },
        { champId: '1', position: 'TOP', version: '12.1' },
      ];
      const MostPosition = [positionInfo.find((v) => v.champId === champId && v.version === version)];
      return MostPosition;
    });
    let positionDbName = Param.position === 'default' ? false : positionList[Param.position];
    let getPosition = !positionDbName ? await repository.getMostPosition(Param.champId, version) : positionDbName;
    expect(getMostPosition).toBeCalledTimes(1);
    expect(getPosition[0].position).toBe('JUNGLE');

    // default 파라미터가 아닌 경우
    Param.position = 'mid';
    positionDbName = Param.position === 'default' ? false : positionList[Param.position];
    getPosition = !positionDbName ? await repository.getMostPosition(Param.champId, version) : positionDbName;

    //default 파라미터였던 상황만 실행되므로 mid로 주워진 targetPosition에선 실행이 안돼서 1번만 실행됨
    expect(getMostPosition).toHaveBeenCalledTimes(1);
    expect(getPosition).toBe('MIDDLE');
  });

getMostPosition 함수 모킹하기

    let getMostPosition = jest.spyOn(repository, 'getMostPosition').mockImplementation(async (champId: string, version: string) => {
      const positionInfo = [
        { champId: '1', position: 'JUNGLE', version: '13.1.' },
        { champId: '1', position: 'TOP', version: '12.1' },
      ];
      const MostPosition = [positionInfo.find((v) => v.champId === champId && v.version === version)];
      return MostPosition;
    });

champId, version을 인자로 받아 해당하는 챔피언의 데이터를 가져오는 함수를 임의로 작성하였다.

파라미터 값으로 포지션 확인하기

let positionDbName = Param.position === 'default' ? false : positionList[Param.position];
let getPosition = !positionDbName ? await repository.getMostPosition(Param.champId, version) : positionDbName;

해당 코드를 통해서 파라미터 값이 ‘default’로 온경우 false값을 지정하고 그외에는 포지션 정보 객체에서 키를 이용해 데이터를 찾는다.

const Param = { champId: '1', position: 'default', };

Param으로 인해 getMostPosition은 실행이 된다.

getMostPosition의 실행 횟수와 return 값으로 테스트 확인하기

expect(getMostPosition).toBeCalledTimes(1);
expect(getPosition[0].position).toBe('JUNGLE');

포지션 정보가 있는 상황에서 getMostPosition에 실행 여부 확인하기

  Param.position = 'mid';
    positionDbName = Param.position === 'default' ? false : positionList[Param.position];
    getPosition = !positionDbName ? await repository.getMostPosition(Param.champId, version) : positionDbName;

파라미터의 position 값을 ‘mid’로 변경하고 다시 로직을 실행한다.

expect(getMostPosition).toHaveBeenCalledTimes(1);
expect(getPosition).toBe('MIDDLE');

처음 파라미터의 position 값이 ‘default’ 였을때 한번 실행 된 후 2번째는 실행이 되지 않기 때문에 1번만 실행되고 함수의 return 값을 확인 해보면 정상적으로 parameter 값에 대한 데이터를 return 함을 알 수 있다.

profile

Woozy_DevLog

@Woozy_Dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!