일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 자료구조
- mysql스키마
- js 알고리즘
- 오블완
- 자바스크립트 정렬
- MySQL
- 자바스크립트 배열
- 맨해튼거리
- 타입스크립트
- 정렬 알고리즘
- 맨해튼거리예제
- 프로그래머스 신규아이디추천
- 프로그래머스
- Javascript 정렬
- 자바스크립트 알고리즘
- 알고리즘
- 좌표거리구하기
- TS
- node.js
- 키패드누르기풀이
- Javascript sort
- TypeScript
- 깃허브
- next.js
- binary search
- 티스토리챌린지
- 프로그래머스 자바스크립트 풀이
- 프로그래머스 자바스크립트
- JavaScript
- 정규표현식문제
- Today
- Total
FE PARADISE
[Jest] 비동기 코드 테스트하기 Testing Asynchronous Code 본문
return Promise
test 코드 안에서 Promise를 return 하고 Jest가 Promise가 resolve될때까지 기다린다. Promise가 reject될 경우에 테스트 결과는 실패로 나오게 된다.
test('promise-return', () => {
return fetchData().then(data => {
expect(data).toEqual({ name: 'Jinyoung', birthYear: 1994 });
})
})
fetchData 라는 { name: 'Jinyoung', birthYear: 1994 } object를 반환하는 promise함수를 가정해보면 위와 같이 테스트를 작성할 수 있다.
Async/Await
test('await', async () => {
const data = await fetchData();
expect(data).toEqual({ name: 'Jinyoung', birthYear: 1994 });
})
다른 방식으로는 async, await를 사용할 수 있다. async를 테스트에 사용하기 위해서는 테스트에 넘겨지는 함수 앞에 async를 붙여야 한다.
it('resolves', () => {
return expect(fetchData()).resolves.toEqual({ name: 'Jinyoung', birthYear: 1994 });
})
it('reject', () => {
return expect(fetchData('error')).rejects.toBe('Network Error!');
})
위와 같이 async, await를 resolves, rejects와 같이 사용할 수도 있다.
Callback
Promise를 사용하지 않는다면 Callback 방식을 사용할 수도 있다. 밑의 예제는 fetchData함수가 Hellow World!를 return 하는지 테스트하고자 한다.
test('callback', () => {
function callback(err, data) {
if (err) {
throw err;
}
expect(data).toBe('Hello World!');
}
fetchData(callback);
});
위 예제에서의 문제는 콜백 함수가 불러지기도 전에 테스트가 끝날것이라는 점이다.
이 문제를 해결하기 위해 아래와 같이 코드를 작성할 수 있다.
test('callback', done => {
function callback(err, data) {
if (err) {
done(err);
return;
}
try {
expect(data).toBe('Hello World!');
done();
} catch (err) {
done(err);
}
}
fetchData(callback);
});
done을 활용하여 비동기 함수가 끝나는 시점을 명시해준다.
done에 대해 알아보기 위해 index.d.ts에서 보면 DoneCallback이 명시되어 있는것을 볼 수 있다.
// index.d.ts
type ProvidesCallback = ((cb: DoneCallback) => void | undefined) | (() => Promise<unknown>);
하지만 위와 같이 콜백 방식으로 done 콜백을 불러와서 비동기 코드를 테스트하는 방식보다는 위의 async/await나 return 방식을 활용하는 것이 좋다.
위의 사진에서 수행에 걸리는 시간의 차이가 크다는 것을 볼수 있다. 때문에 done 방식은 사용을 추천하지 않는다.
'프론트엔드 > TDD' 카테고리의 다른 글
CI/CD란 무엇인가? (0) | 2022.10.07 |
---|---|
TDD란? 테스트 주도 개발에 대해 (0) | 2022.10.06 |