๐Ÿงฑ Jest ๊ฐœ๋… ์ •๋ฆฌ - ๋น„๋™๊ธฐ ์ฝ”๋“œ ํ…Œ์ŠคํŠธ(์ฝœ๋ฐฑ, Promise, async/await)

JS Kยท2025๋…„ 10์›” 22์ผ
post-thumbnail

Jest ๊ณต์‹ ๋ฌธ์„œ ์ฐธ๊ณ : https://jestjs.io/docs/asynchronous


๐ŸŽฏ ๊ฐœ์š”

Jest๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋Š” ์ฆ‰์‹œ ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ ์ฝ”๋“œ(setTimeout, Promise, fetch, async/await)๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ๋Š” โ€œ์–ธ์ œ ๋๋‚ฌ๋Š”์ง€โ€ Jest์—๊ฒŒ ์•Œ๋ ค์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.





๐Ÿงฉ 1๏ธโƒฃ ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜ (Callback Style)

โŒ ์ž˜๋ชป๋œ ์˜ˆ์‹œ (done ์—†์Œ)

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);
});

โš ๏ธ ์™œ ์‹คํŒจํ•˜๋‚˜?

  • Jest๋Š” ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ๋๋‚˜๋ฉด โ€œํ…Œ์ŠคํŠธ ์™„๋ฃŒโ€๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.
  • fetchData๋Š” ๋น„๋™๊ธฐ์ด๋ฏ€๋กœ, callback()์€ ๋‚˜์ค‘์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, Jest๋Š” callback์ด ์‹คํ–‰๋˜๊ธฐ๋„ ์ „์— ํ…Œ์ŠคํŠธ๋ฅผ ๋๋‚ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ expect๋Š” ์•„์˜ˆ ์‹คํ–‰๋˜์ง€ ์•Š๊ฑฐ๋‚˜, ํ…Œ์ŠคํŠธ๋Š” ์˜๋ฏธ ์—†์ด ํ†ต๊ณผํ•ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ (done ์‚ฌ์šฉ)

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์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.





๐Ÿง  2๏ธโƒฃ Promise ๊ธฐ๋ฐ˜

๐Ÿ’ป ํ•จ์ˆ˜

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๋Š” ์—ฌ์ „ํžˆ โ€œ๋ฐ”๋กœ ๋๋‚œ ํ…Œ์ŠคํŠธโ€๋กœ ์˜คํ•ดํ•จ.





โš™๏ธ 3๏ธโƒฃ async / await ๊ธฐ๋ฐ˜

๐Ÿ’ป ํ•จ์ˆ˜

async function fetchData() {
  return 'peanut butter';
}

๐Ÿ’ป ํ…Œ์ŠคํŠธ

test('async/await ๊ธฐ๋ฐ˜ fetchData', async () => {
  const data = await fetchData();
  expect(data).toBe('peanut butter');
});

๐Ÿ’ก ํฌ์ธํŠธ

  • Jest๋Š” async ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” Promise๋ฅผ ์ž๋™์œผ๋กœ ๊ธฐ๋‹ค๋ฆผ.
  • ๊ฐ€์žฅ ๊ฐ„๊ฒฐํ•˜๊ณ  ํ˜„๋Œ€์ ์ธ ๋ฐฉ์‹.





๐Ÿ’ฅ ์˜ˆ์™ธ ๋ฐœ์ƒ ๋ฒ„์ „ (reject)

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() ํ˜ธ์ถœ ์‹œ์˜ค๋ž˜๋œ ํŒจํ„ด, ๋ช…์‹œ์  ์ œ์–ด
Promisereturn PromisePromise resolve/reject ์‹œdone ๋ถˆํ•„์š”
async/awaitawait fetchData()async ํ•จ์ˆ˜ ์™„๋ฃŒ ์‹œ๊ฐ„๊ฒฐํ•˜๊ณ  ์ถ”์ฒœ
rejectsawait expect(...).rejectsreject ์‹œ์—๋Ÿฌ ๊ฒ€์ฆ ๊ฐ„๊ฒฐ





โš ๏ธ ์ฃผ์˜: done + Promise๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ

test('bad example', (done) => {
  return fetchData().then(...); // โŒ done๊ณผ Promise ๋‘˜ ๋‹ค ์‚ฌ์šฉ
});

์ด๊ฑด Jest๊ฐ€ โ€œ์–ธ์ œ ๋๋‚œ ๊ฑด์ง€ ๋ชจ๋ฆ„โ€ โ†’ ํ˜ผ๋ž€ โ†’ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€ ์ฐจ์›์—์„œ ์—๋Ÿฌ ๋ฐœ์ƒ.





โœ… ํ•ต์‹ฌ ์š”์•ฝ

  • Jest๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ โ€œ๋๋‚ฌ๋Š”์ง€โ€๋ฅผ ์Šค์Šค๋กœ ๋ชจ๋ฅธ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋ฐ˜๋“œ์‹œ done, return Promise, async/await ์ค‘ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • done()์„ ์žŠ์œผ๋ฉด โ€œtimeout ์—๋Ÿฌโ€, try/catch๋ฅผ ์•ˆ ์“ฐ๋ฉด โ€œ์—๋Ÿฌ ์›์ธ ํ‘œ์‹œ ๋ถˆ๊ฐ€โ€.
  • modern JS ํ™˜๊ฒฝ์—์„œ๋Š” async/await + resolves/rejects ์กฐํ•ฉ์ด ๊ฐ€์žฅ ๊น”๋”ํ•˜๊ณ  ์•ˆ์ „ํ•˜๋‹ค.

profile
1.01^365

0๊ฐœ์˜ ๋Œ“๊ธ€