[Node.js] Jest - 2. 비동기 코드 테스트
callback
비동기 코드 작성
fn.js
const fn = {
getName:(callback) => {
const name="Mike";
setTimeout(()=>{
callback(name);
}, 3000)
}, // 3초 후에 이름을 알려주는 함수
};
module.exports = fn;
테스트 코드 작성
fn.test.js
const fn = require("./fn");
test("3초 후에 받아온 이름은 Mike", done => {
function callback(name){
expect(name).toBe("Mike");
done();
}
fn.getName(callback);
}); // 테스트 성공
테스트 함수에 done
이라는 콜백함수를 전달 -> done()
이 호출되기 전까지 jest는 테스트를 끝내지 않고 기다린다.
try-catch
fn.js
const fn = {
getName:(callback) => {
const name="Mike";
setTimeout(()=>{
// callback(name);
throw new Error('서버 에러...'); // 에러 전달
}, 3000)
},
};
module.exports = fn;
fn.test.js
const fn = require("./fn");
test("3초 후에 받아온 이름은 Mike", done => {
function callback(name){
try{
expect(name).toBe("Mike");
done();
} catch(error){
done(); // '서버 에러...'가 터미널에 찍힌다.
}
}
fn.getName(callback);
}); // 테스트 실패
api 에러를 감지하고 싶다면 try-catch문으로 감싸준다.
promise
비동기 코드 작성
fn.js
const fn = {
getAge:() => {
const age=30;
return new Promise((res,rej)=>{
setTimeout(()=>{
res(age);
// rej('error'); // reject 상황을 테스트하기 위해서..
}, 3000)
});
},
};
module.exports = fn;
promise
를 넘겨주면 jest는 resolve
될 때까지 기다린다. 따라서 테스트 함수에 done
을 전달하지 않아도 된다.
테스트 코드 작성
test("3초 후에 받아온 나이는 30", () => {
return fn.getAge().then(age => { // 🌟
expect(age).toBe(30);
});
}); // 테스트 성공
🚨 비동기 코드에 promise
를 사용했다면, 테스트 코드에서 return
을 잊으면 안됨!
보다 간단히 작성하기 위한 Matcher 사용
resolves
test("3초 후에 받아온 나이는 30", () => {
return expect(fn.getAge()).resolves.toBe(30);
}); // 테스트 성공
rejects
test("3초 후에 에러가 납니다.", () => {
return expect(fn.getAge()).rejects.toMatch('error');
}); // 테스트 성공
async-await
비동기 코드 작성 -> ❓🤔❓
fn.js
const fn = async () => {
getAge:() => {
const age=30;
setTimeout(()=>{
return age;
}, 3000)
},
};
module.exports = fn;
테스트 코드 작성
test("3초 후에 에러가 납니다.", async () => {
const age = await fn.getAge();
expect(age).toBe(30);
}); // 테스트 성공
보다 간단히 작성하기 위한 Matcher 사용
resolves
test("3초 후에 받아온 나이는 30", () => {
await expect(fn.getAge()).resolves.toBe(30);
}); // 테스트 성공
return
대신 await
으로 변경
rejects
test("3초 후에 에러가 납니다.", () => {
await expect(fn.getAge()).rejects.toMatch('error');
}); // 테스트 성공
return
대신 await
으로 변경
참고
💛 개인 공부 기록용 블로그입니다. 👻