async (비동기)에 관한 test

YOUNGJOO-YOON·2021년 8월 8일
0

asyn

const fn={
	getName:callback=>{
		const name='Yoon'
		setTimeout(()=>{
			callback(name);
		},3000);
	}

};
module.exports=fn;


it('3 초 후에 받아온 이름은 "yoon"',()=>{
	function sayMyName(name){
		return expect(name).toBe('Yoon');
	}
	fn.getName(sayMyName);
})  
// 3 초를 기다리지 않고 test 성공함.
// 정상적이진 않지만 test가 작동함

결국 jest도 함수이기 때문에 원하는 expect와 matcher가 일치한다면 그 test에 대해 성공을 반환해주게 된다.

it('3 초 후에 받아온 이름은 "yoon"',(done)=>{
	function sayMyName(name){
		expect(name).toBe('Yoon');
		done();
	}
	fn.getName(sayMyName);
})3 초 후에 받아온 이름은 "yoon" (3008 ms)

비동기를 처리하기 위해 test 함수의 인자로 done을 넘겨주고 비동기 처리가 끝날때까지 기다리게끔 done()의 위치를 지정해주면 된다.

setTimeout(()=>{😎},1000) // 비동기 처리 line...
done() // done의 위치

Promise 패턴

	getAge:()=>{
		const age=29;
		return new Promise((res,rej)=>{
			setTimeout(()=>{
				res(age);
			},2000)
		})
	}

it('2 초 후에 받아올 나이는 29',()=>{
	return fn.getAge().then(age=>{
		expect(age).toBe(29)
	})
})

async 함수이면서 promise를 사용한다면
함수를 실행시키고 then으로 res or rej를 기다리고 받은 값을 가지고 expect.matcher를 사용해주자. promise라면 done()을 받고 자리를 정해주는 것이 아닌 return으로 돌려주어야 한다.


resolves, rejects 사용하기

resolves, rejects

  • resolves, rejects는 jest에서 제공하는 함수이다.
    이를 사용하면 promise의 resolve, reject를 기다린 다음 값을 받아와 matcher와 연계하는 것을 지원해준다. (말이 이상하지만 무슨 뜻인지 알 것이다.)

resolves

it('2 초 후에 받아올 나이는 29',()=>{
	expect(fn.getAge()).resolves.toBe(29);
})

jest에서는 resolves, rejects를 통해 비동기 함수를 보다 간단하게 테스트 할 수 있게 해준다.


rejects


	getAge:()=>{
		const age=29;
		return new Promise((res,rej)=>{
			setTimeout(()=>{
				// res(age);
				rej('error!');
			},2000)
		})
	}
it('2 초 후에 error!',()=>{
	expect(fn.getAge()).rejects.toMatch('error!');
})

async await


it('2 초 후에 age 29',async ()=>{
	const age = await fn.getAge();
	expect(age).toBe(29);
})

결국 jest도 node.js 위에서 작동하는 함수에 불과하다.

기존의 지식을 잘 활용하자.

profile
이 블로그의 글은 제 생각을 정리한 글과 인터넷 어딘가에서 배운 것을 정리한 글입니다. 출처는 되도록 남기도록 하겠습니다. 수정 및 건의 오류 등이 있으면 언제든지 댓글 부탁드립니다.

0개의 댓글