
Jest ๊ณต์ ๋ฌธ์ ์ฐธ๊ณ : https://jestjs.io/docs/asynchronous
Jest๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ
์คํธ ํจ์๊ฐ ๋๋๋ ์ฆ์ ํ
์คํธ๊ฐ ์๋ฃ๋์๋ค๊ณ ํ๋จํฉ๋๋ค.
๋ฐ๋ผ์ ๋น๋๊ธฐ ์ฝ๋(setTimeout, Promise, fetch, async/await)๋ฅผ ํ
์คํธํ ๋๋ โ์ธ์ ๋๋ฌ๋์งโ Jest์๊ฒ ์๋ ค์ฃผ์ด์ผ ํฉ๋๋ค.
function fetchData(callback) {
setTimeout(() => {
callback(null, 'peanut butter');
}, 1000);
}
test('the data is peanut butter', () => {
function callback(error, data) {
if (error) {
throw error;
}
expect(data).toBe('peanut butter');
}
fetchData(callback);
});
fetchData๋ ๋น๋๊ธฐ์ด๋ฏ๋ก, callback()์ ๋์ค์ ์คํ๋ฉ๋๋ค.expect๋ ์์ ์คํ๋์ง ์๊ฑฐ๋, ํ
์คํธ๋ ์๋ฏธ ์์ด ํต๊ณผํด๋ฒ๋ฆฝ๋๋ค.function fetchData(callback) {
setTimeout(() => {
callback(null, 'peanut butter');
}, 1000);
}
test('the data is peanut butter', (done) => {
function callback(error, data) {
if (error) {
done(error);
return;
}
try {
expect(data).toBe('peanut butter');
done(); // โ
์ฑ๊ณต ์ ํธ์ถ
} catch (error) {
done(error); // โ ์คํจ ์ Jest์ ์๋ฌ ์ ๋ฌ
}
}
fetchData(callback);
});
| ๋จ๊ณ | ์ค๋ช |
|---|---|
| โ | Jest๊ฐ ํ ์คํธ ํจ์ ์คํ ์์ |
| โก | fetchData(callback) ํธ์ถ โ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์์ |
| โข | Jest๋ โdone์ด ์์ผ๋ ๊ธฐ๋ค๋ ค์ผ๊ฒ ๊ตฐโ ํ๊ณ ๋ฉ์ถค |
| โฃ | ๋์ค์ callback() ํธ์ถ๋จ |
| โค | expect() ํต๊ณผ โ done() ์คํ โ Jest๊ฐ ํ
์คํธ๋ฅผ ์ข
๋ฃ |
| โฅ | expect() ์คํจ โ done(error) ์คํ โ Jest๊ฐ ์คํจ ์ฒ๋ฆฌ |
โ
done()์ โํ ์คํธ๊ฐ ๋๋ฌ๋คโ๋ ์ ํธ๋ฅผ Jest์๊ฒ ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค.
function fetchData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('peanut butter');
}, 1000);
});
}
test('Promise ๊ธฐ๋ฐ fetchData', () => {
return fetchData().then((data) => {
expect(data).toBe('peanut butter');
});
});
done() ๋์ Promise๋ฅผ returnํ๋ฉด Jest๊ฐ ์์์ ๊ธฐ๋ค๋ฆฝ๋๋ค.return์ด ์์ผ๋ฉด Jest๋ ์ฌ์ ํ โ๋ฐ๋ก ๋๋ ํ
์คํธโ๋ก ์คํดํจ.async function fetchData() {
return 'peanut butter';
}
test('async/await ๊ธฐ๋ฐ fetchData', async () => {
const data = await fetchData();
expect(data).toBe('peanut butter');
});
async ํจ์๊ฐ ๋ฐํํ๋ Promise๋ฅผ ์๋์ผ๋ก ๊ธฐ๋ค๋ฆผ.function fetchDataWithError() {
return Promise.reject(new Error('Network Error'));
}
test('rejects ์ฒ๋ฆฌ', async () => {
await expect(fetchDataWithError()).rejects.toThrow('Network Error');
});
โ
rejects.toThrow()๋ ๋น๋๊ธฐ ์๋ฌ ๊ฒ์ฆ์ ์ต์ ํ๋ ๋ฌธ๋ฒ.
| ๋ฐฉ์ | ์ฝ๋ ์์ | Jest ์ธ์ ๋ฐฉ์ | ํน์ง |
|---|---|---|---|
| ์ฝ๋ฐฑ(done) | fetchData(cb) | done() ํธ์ถ ์ | ์ค๋๋ ํจํด, ๋ช ์์ ์ ์ด |
| Promise | return Promise | Promise resolve/reject ์ | done ๋ถํ์ |
| async/await | await fetchData() | async ํจ์ ์๋ฃ ์ | ๊ฐ๊ฒฐํ๊ณ ์ถ์ฒ |
| rejects | await expect(...).rejects | reject ์ | ์๋ฌ ๊ฒ์ฆ ๊ฐ๊ฒฐ |
done + Promise๋ฅผ ํจ๊ป ์ฌ์ฉํ์ง ๋ง ๊ฒtest('bad example', (done) => {
return fetchData().then(...); // โ done๊ณผ Promise ๋ ๋ค ์ฌ์ฉ
});
์ด๊ฑด Jest๊ฐ โ์ธ์ ๋๋ ๊ฑด์ง ๋ชจ๋ฆโ โ ํผ๋ โ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง ์ฐจ์์์ ์๋ฌ ๋ฐ์.
done, return Promise, async/await ์ค ํ๋๋ง ์ฌ์ฉํด์ผ ํ๋ค.done()์ ์์ผ๋ฉด โtimeout ์๋ฌโ, try/catch๋ฅผ ์ ์ฐ๋ฉด โ์๋ฌ ์์ธ ํ์ ๋ถ๊ฐโ.async/await + resolves/rejects ์กฐํฉ์ด ๊ฐ์ฅ ๊น๋ํ๊ณ ์์ ํ๋ค.