본문 바로가기
프론트엔드/TDD

[Jest] 비동기 코드 테스트하기 Testing Asynchronous Code

by PARADISE247 2022. 10. 7.
반응형

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콜백을 사용하였을 때 - 약 6초
return promise 방식을 사용하였을 때 - 1초 미만

위의 사진에서 수행에 걸리는 시간의 차이가 크다는 것을 볼수 있다. 때문에 done 방식은 사용을 추천하지 않는다. 

반응형

'프론트엔드 > TDD' 카테고리의 다른 글

CI/CD란 무엇인가?  (0) 2022.10.07
TDD란? 테스트 주도 개발에 대해  (0) 2022.10.06