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 함을 알 수 있다.
'Project > Carryduo' 카테고리의 다른 글
Carryduo 정적 파일 저장 및 응답하기 (0) | 2023.03.22 |
---|---|
RDS start/stop 으로 실행 시간 조작하기 (0) | 2023.03.22 |
Carryduo DTO (0) | 2023.03.21 |
데이터 수집 프로세스 관리 및 오프셋 파일 저장 (0) | 2023.03.21 |
Carryduo 소환사 전적 갱신 요청 제한 시간 구현 (0) | 2023.03.21 |