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


๐ŸŽฏ Modifier๋ž€?

Modifier(์ˆ˜์ •์ž)๋Š” Jest์—์„œ ๋งค์ฒ˜์˜ ๋™์ž‘์„ ๋ฐ”๊พธ๋Š” ์†์„ฑ์ด๋‹ค.
์ฆ‰, expect()๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” Expectation ๊ฐ์ฒด์— ๋ถ™์–ด์„œ
๋งค์ฒ˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜์ „์‹œํ‚ค๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋„๋ก ๋งŒ๋“ค์–ด์ค€๋‹ค.

expect(value)
  .not.toBe(...)        // ๊ฒฐ๊ณผ ๋ฐ˜์ „
  .resolves.toEqual(...) // Promise resolve ๊ฒ€์ฆ
  .rejects.toThrow(...)  // Promise reject ๊ฒ€์ฆ





1๏ธโƒฃ not โ€” ๊ฒฐ๊ณผ ๋ฐ˜์ „

๐Ÿ“˜ ๊ฐœ๋…

not์€ ๋งค์ฒ˜์˜ ๋น„๊ต ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜๋Œ€๋กœ ๋’ค์ง‘๋Š”๋‹ค.
์ฆ‰, โ€œ~์ด ์•„๋‹ˆ๋‹คโ€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

expect(2 + 2).not.toBe(5);
expect(['apple', 'banana']).not.toContain('orange');

์ด ๊ตฌ๋ฌธ์„ ์ฝ์œผ๋ฉด

โ€œ2 ๋”ํ•˜๊ธฐ 2๋Š” 5๊ฐ€ ์•„๋‹ˆ๋‹ค.โ€
โ€œ๋ฐฐ์—ด์— orange๋Š” ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.โ€

์ฒ˜๋Ÿผ ๋ฌธ์žฅ์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฝํžˆ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ๋œ๋‹ค.





2๏ธโƒฃ resolves โ€” Promise๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ดํ–‰(resolve)๋  ๊ฒƒ์„ ๊ธฐ๋Œ€

๐Ÿ“˜ ๊ฐœ๋…

๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ์—์„œ, resolves๋Š”
Promise๊ฐ€ ์ •์ƒ์ ์œผ๋กœ resolve๋˜์–ด ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ๊ฒ€์ฆํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

์ฆ‰,

"์ด Promise๋Š” ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚˜์•ผ ํ•˜๋ฉฐ, ๊ฒฐ๊ณผ๊ฐ’์€ โ€ฆ์ด๋‹ค."

๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ตฌ๋ฌธ์ด๋‹ค.

๐Ÿ’ป ์˜ˆ์‹œ ์ฝ”๋“œ

const fetchData = () => Promise.resolve({ status: 'ok', data: [1, 2, 3] });

test('fetchData๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜์–ด status๊ฐ€ ok์—ฌ์•ผ ํ•œ๋‹ค', async () => {
  await expect(fetchData()).resolves.toEqual(
    expect.objectContaining({ status: 'ok' })
  );
});

์œ„ ์ฝ”๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์•„๋ž˜์™€ ๋™์ผํ•œ ์˜๋ฏธ๋‹ค ๐Ÿ‘‡

const result = await fetchData();
expect(result).toEqual(expect.objectContaining({ status: 'ok' }));

โœ… ์š”์•ฝ

  • await expect(Promise).resolves.๋งค์ฒ˜()
  • Promise๊ฐ€ resolve๋œ ๊ฐ’์— ๋Œ€ํ•ด ๋งค์ฒ˜ ๊ฒ€์ฆ ์ˆ˜ํ–‰
  • await๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ถ™์—ฌ์•ผ ํ•จ (ํ…Œ์ŠคํŠธ ์ข…๋ฃŒ ํƒ€์ด๋ฐ ์ค‘์š”)





3๏ธโƒฃ rejects โ€” Promise๊ฐ€ ์‹คํŒจ(reject)๋  ๊ฒƒ์„ ๊ธฐ๋Œ€

๐Ÿ“˜ ๊ฐœ๋…

๋น„๋™๊ธฐ ๋กœ์ง์ด ์‹คํŒจํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋  ๋•Œ,
๊ทธ reject๋œ ์ด์œ (์—๋Ÿฌ ๊ฐ์ฒด) ๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰,

"์ด Promise๋Š” ์‹คํŒจํ•  ๊ฒƒ์ด๋ฉฐ, ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋Š” โ€ฆ์ผ ๊ฒƒ์ด๋‹ค."

๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.

๐Ÿ’ป ์˜ˆ์‹œ ์ฝ”๋“œ

const fetchDataWithError = () => Promise.reject(new Error('Unauthorized'));

test('fetchDataWithError๊ฐ€ Unauthorized ์—๋Ÿฌ๋กœ reject๋˜์–ด์•ผ ํ•œ๋‹ค', async () => {
  await expect(fetchDataWithError()).rejects.toThrow('Unauthorized');
});

์ด ๊ตฌ๋ฌธ์€ ์•„๋ž˜์™€ ๋™์ผํ•œ ๋กœ์ง์ด๋‹ค ๐Ÿ‘‡

try {
  await fetchDataWithError();
} catch (error) {
  expect(error).toThrow('Unauthorized');
}

โœ… ์š”์•ฝ

  • await expect(Promise).rejects.๋งค์ฒ˜()
  • reject๋œ Promise์˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋‚˜ ํƒ€์ž…์„ ๊ฒ€์ฆ
  • ์‹คํŒจ๊ฐ€ ์˜ˆ์ƒ๋˜๋Š” ๋น„๋™๊ธฐ ๋กœ์ง ํ…Œ์ŠคํŠธ์— ์ ํ•ฉ





โš ๏ธ ์ฃผ์˜ํ•  ์ 

  1. resolves / rejects๋Š” Promise์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

    • Promise๊ฐ€ ์•„๋‹Œ ๊ฐ’์— ์“ฐ๋ฉด Jest๊ฐ€ ์—๋Ÿฌ๋ฅผ ๋˜์ง„๋‹ค.
    • ์˜ˆ: expect(123).resolves.toBe(123) โŒ
  2. await๋ฅผ ๊ผญ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.

    • await ์—†์ด ์ž‘์„ฑํ•˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ๋จผ์ € ๋๋‚˜๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  3. not์€ ๋ชจ๋“  ๋งค์ฒ˜์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ,
    resolves / rejects๋Š” ๋น„๋™๊ธฐ ๋งค์ฒ˜ ์ „์šฉ Modifier๋‹ค.

profile
1.01^365

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