비동기 test

비동기 코드 테스트

jest 는 테스트가 끝나면 바로 끝나버림. 콜백 함수를 넘겨주어도 기다리지 않고 끝나기 때문에 제대로 된 테스트를 진행할 수 없다. 이때는 test네 콜백에 인자로 done을 넘겨주면 된다. 이 done이 호출되면 테스트가 끝났다고 명시할 수 있어서 콜백이 끝나는 부분에서 done을 호출하면 제대로된 테스트를 할 수 있다.

fn :

1
2
3
4
5
6
7
8
9
10
11
12
13
const fn = {
add: (num1, num2) => num1 + num2,
makeUser: (name, age) => ({ name, age, gender: undefined }),
throwErr: () => {
throw new Error("xx");
},
getName: (cb) => {
const name = "Mike";
setTimeout(() => {
cb(name);
}, 3000);
},
};

test :

1
2
3
4
5
6
7
test("3초 후에 받아온 이름은 Mike이다.", (done) => {
const cb = (name) => {
expect(name).toBe("Mike");
done();
};
fn.getName(cb);
});

만약 done을 받고 호출하지 않으면 timeout으로 종료 되고 테스트는 실패한다.

에러를 검사하고 싶으면 try catch를 사용하면 된다.

1
2
3
4
5
6
7
8
9
10
11
test("서버 에러 비동기 테스트", (done) => {
const cb = (name) => {
try {
expect(name).toBe("Mike");
done();
} catch (error) {
done();
}
};
fn.getNameError(cb);
});

promise를 리턴하면 jest는 promise 가 resolve 될때까지 기다려 준다. 단 이때는 return을 명시해 주어야 한다.

1
2
3
test("promise test", () => {
return fn.getAge().then((age) => expect(age).toBe(30));
});

보다 간단하게 사용하기 위한 resolves, rejects matcher 가 있다.

1
2
3
test("promise test resolve Matcher", () => {
return expect(fn.getAge()).resolves.toBe(30);
});

async await 도 사용할 수 있다.

1
2
3
4
test("3초후에 async await test", async () => {
const age = await fn.getAge();
expect(age).toBe(30);
});

마찬가지로 resolves, rejects를 사용할 수 있다.

1
2
3
test("3초 후에 resolves 쓰는 패턴", async () => {
await expect(fn.getAge()).resolves.toBe(30);
});