[Jest] 비동기 코드 테스트

@1000peach2022. 05. 15  -  ☕️ 2 min read
[Jest] 비동기 코드 테스트

1. Callback 테스트

1-1. setTimeout 테스트

jest는 테스트가 시작되면 실행을 멈추지 않는다. 이를 위해 done 콜백을 받으면 done이 호출되기 전까지 테스트를 끝내지 않고 기다린다.

fn.ts

// 3초 뒤 Mike를 callback 함수로 넘겨준다. const fn = { getName: (callback: CallableFunction) => { const name = 'Mike' setTimeout(() => { callback(name) }, 3000) }, } export default fn

fn.test.ts

// 테스트 성공 test('3초 뒤 이름 Mike를 반환한다', done => { const callback = (name: string) => { expect(name).toBe('Mike') done() } fn.getName(callback) })
done을 생략하면 Timeout으로 테스트가 실패한다.

타임아웃 에러

기본 설정 5초 동안 응답이 없어서 테스트 실패로 간주한다.

1-2. 에러 테스트

에러를 감지 하려면 try-catch 문으로 감싼다.

// 3초 뒤 에러를 던진다. const fn = { getName: (callback: CallableFunction) => { const name = 'Mike' setTimeout(() => { // callback(name) throw new Error('error!') }, 3000) }, } export default fn // 테스트 실패 test('3초 뒤 이름 Mike를 반환한다.', done => { const callback = (name: string) => { try { expect(name).toBe('Mike') done() } catch (err) { done() } } fn.getName(callback) })

2. Promise 테스트

promise로 리턴해주면 resolve 될 때 까지 기다리기 때문에 done을 호출하지 않아도 된다.

2-1. then-catch

promise를 테스트할 땐 테스트를 return 해야한다. (return 하지 않으면 테스트가 종료됨)

const fn = { getAge: () => { const age = 30 return new Promise((resolve, reject) => { setTimeout(() => { resolve(age) }, 3000) }) }, } // 테스트 성공 test('3초 뒤 promise로 나이 30을 반환한다.', () => { return fn.getAge().then(age => { expect(age).toBe(30) }) })

2-2. resolves, rejects 매처 사용

promise도 매처로 간단하게 작성할 수 있다.

// 테스트 성공 test('3초 뒤 promise로 나이 30을 반환한다.', () => { return expect(fn.getAge()).resolves.toBe(30) // resolve 테스트 // return expect(fn.getAge()).rejects.toMatch("error"); // 에러 반환 시 reject 테스트 })

3. async/await

return 대신 await으로 호출한다.

// 테스트 성공 test('3초 뒤 promise로 나이 30을 반환한다.', async () => { const age = await fn.getAge() expect(age).toBe(30) })

🔗 참고

이전 게시글

[Jest] Jest 시작하기

다음 게시글

[Jest] 테스트 전후 작업

profile

@1000peach

    GitHubGmailPortfolio
© 2022 1000peach, Powered By Gatsby.