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의 위치
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으로 돌려주어야 한다.
it('2 초 후에 받아올 나이는 29',()=>{
expect(fn.getAge()).resolves.toBe(29);
})
jest에서는 resolves, 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!');
})
it('2 초 후에 age 29',async ()=>{
const age = await fn.getAge();
expect(age).toBe(29);
})
결국 jest도 node.js 위에서 작동하는 함수에 불과하다.
기존의 지식을 잘 활용하자.