๊ณต์‹ ๋ฌธ์„œ ์ฐธ๊ณ : https://jestjs.io/docs/using-matchers


๐Ÿ“˜ 1๏ธโƒฃ toBe โ€” ์›์‹œ๊ฐ’ ์ผ์น˜ (===)

๐Ÿ’ก ๊ฐœ๋…

toBe๋Š” ์—„๊ฒฉํ•œ ์ผ์น˜(===) ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
์ฆ‰, ๊ฐ’๋ฟ ์•„๋‹ˆ๋ผ ํƒ€์ž…๊นŒ์ง€ ๋™์ผํ•ด์•ผ ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•œ๋‹ค.

๐Ÿ’ป ์˜ˆ์‹œ

test('toBe๋Š” === ๋น„๊ต๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค', () => {
  expect(2 + 2).toBe(4);          // โœ… 4 === 4
  expect('hello').toBe('hello');  // โœ… ๋ฌธ์ž์—ด ๋™์ผ
  expect(true).not.toBe(false);   // โœ… ๋ฐ˜๋Œ€๊ฐ’์ด๋ฏ€๋กœ ํ†ต๊ณผ
});

โš ๏ธ ์ฃผ์˜

  • ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์€ ์ฐธ์กฐ(reference)๊ฐ€ ๋‹ค๋ฅด๋ฉด ์‹คํŒจํ•œ๋‹ค.
expect({ a: 1 }).toBe({ a: 1 }); // โŒ ๋‹ค๋ฅธ ๊ฐ์ฒด

์ด๋Ÿด ๋• toEqual์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.





๐Ÿ“˜ 2๏ธโƒฃ toEqual โ€” ๊ตฌ์กฐ์  ์ผ์น˜ (deep equality)

๐Ÿ’ก ๊ฐœ๋…

toEqual์€ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ๊ฐ’๊นŒ์ง€ ๋น„๊ตํ•œ๋‹ค.
์ฆ‰, ์ฐธ์กฐ๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ๊ตฌ์กฐ์™€ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ํ†ต๊ณผํ•œ๋‹ค.

๐Ÿ’ป ์˜ˆ์‹œ

test('toEqual์€ ๊ฐ์ฒด/๋ฐฐ์—ด ๋‚ด๋ถ€ ๊ฐ’ ๋น„๊ต', () => {
  expect({ a: 1, b: 2 }).toEqual({ a: 1, b: 2 });
  expect([1, 2, 3]).toEqual([1, 2, 3]);
});

โš™๏ธ ์ฐธ๊ณ 

  • toStrictEqual์€ toEqual๋ณด๋‹ค ๋” ์—„๊ฒฉํ•˜๊ฒŒ
    (์˜ˆ: undefined ํ”„๋กœํผํ‹ฐ, ํ”„๋กœํ† ํƒ€์ž… ์ฐจ์ด๊นŒ์ง€ ๊ฒ€์‚ฌ)





๐Ÿ“˜ 3๏ธโƒฃ toBeTruthy / toBeFalsy โ€” Truthiness ํŒ๋ณ„

๐Ÿ’ก ๊ฐœ๋…

JS์—์„œ true๋กœ ํ‰๊ฐ€๋˜๋Š” ๊ฐ’ / false๋กœ ํ‰๊ฐ€๋˜๋Š” ๊ฐ’์„ ๊ฒ€์ฆํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
(Truthy / Falsy ๊ฐœ๋… ๊ธฐ๋ฐ˜)

๐Ÿ’ป ์˜ˆ์‹œ

test('Truthy / Falsy ๊ฐ’ ํŒ๋ณ„', () => {
  expect('hello').toBeTruthy(); // โœ… ๋ฌธ์ž์—ด์€ Truthy
  expect(1).toBeTruthy();
  expect(0).toBeFalsy();        // โœ… 0์€ Falsy
  expect(null).toBeFalsy();
});

โš ๏ธ ์ฃผ์˜

  • toBeTruthy()๋Š” value == true๊ฐ€ ์•„๋‹˜
  • ๋‹จ์ง€ JS์—์„œ "if(value)" ์กฐ๊ฑด๋ฌธ์œผ๋กœ true๋กœ ํ‰๊ฐ€๋˜๋Š”๊ฐ€๋ฅผ ์˜๋ฏธํ•œ๋‹ค.





๐Ÿ“˜ 4๏ธโƒฃ toBeNull / toBeUndefined โ€” ๋ช…ํ™•ํ•œ ์ƒํƒœ ๊ตฌ๋ถ„

๐Ÿ’ก ๊ฐœ๋…

๊ฐ’์ด ์ •ํ™•ํžˆ null ๋˜๋Š” undefined์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ’ป ์˜ˆ์‹œ

test('null / undefined ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„', () => {
  const data = { name: null };

  expect(data.name).toBeNull();        // โœ… ์ •ํ™•ํžˆ null
  expect(data.age).toBeUndefined();    // โœ… ์กด์žฌํ•˜์ง€ ์•Š์Œ
  expect(data.name).not.toBeUndefined();
});

โš™๏ธ ์ฐธ๊ณ 

  • toBeNull()์€ value === null
  • toBeUndefined()๋Š” value === undefined





๐Ÿ“˜ 5๏ธโƒฃ toContain โ€” ๋ฐฐ์—ด ๋˜๋Š” ๋ฌธ์ž์—ด ํฌํ•จ ์—ฌ๋ถ€

๐Ÿ’ก ๊ฐœ๋…

๋ฐฐ์—ด, ๋ฌธ์ž์—ด, Set ๋“ฑ iterable ๊ฐ์ฒด์— ํŠน์ • ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.

๐Ÿ’ป ์˜ˆ์‹œ

test('๋ฐฐ์—ด ๋˜๋Š” ๋ฌธ์ž์—ด ํฌํ•จ ์—ฌ๋ถ€', () => {
  const shoppingList = ['milk', 'bread', 'butter'];

  expect(shoppingList).toContain('bread');       // โœ… ํฌํ•จ
  expect('Hello Jest').toContain('Jest');        // โœ… ๋ฌธ์ž์—ด ํฌํ•จ
  expect(['a', 'b', 'c']).not.toContain('d');    // โœ… ์—†์Œ
});

โš™๏ธ ์ฐธ๊ณ 

  • ๊ฐ์ฒด ๋ฐฐ์—ด์˜ ์ผ๋ถ€๋ฅผ ๋น„๊ตํ•˜๋ ค๋ฉด toContainEqual์„ ์‚ฌ์šฉํ•œ๋‹ค.
expect([{ id: 1 }]).toContainEqual({ id: 1 });





๐Ÿ“˜ 6๏ธโƒฃ toThrow โ€” ์˜ˆ์™ธ ๋ฐœ์ƒ ๊ฒ€์ฆ

๐Ÿ’ก ๊ฐœ๋…

ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•œ๋‹ค.
๋ฉ”์‹œ์ง€๋‚˜ ์—๋Ÿฌ ํƒ€์ž…๊นŒ์ง€ ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ’ป ์˜ˆ์‹œ

โœ… ์ธ์ž๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜

function compileCode() {
  throw new Error('syntax error: missing ;');
}

test('compileCode๋Š” ์—๋Ÿฌ๋ฅผ ๋˜์ ธ์•ผ ํ•œ๋‹ค', () => {
  expect(compileCode).toThrow();                      // โœ… ์–ด๋–ค ์—๋Ÿฌ๋“  ๋ฐœ์ƒํ•˜๋ฉด ํ†ต๊ณผ
  expect(compileCode).toThrow('syntax');              // โœ… ๋ฉ”์‹œ์ง€ ๋ถ€๋ถ„ ์ผ์น˜
  expect(compileCode).toThrow(/missing ;/);           // โœ… ์ •๊ทœ์‹ ์ผ์น˜
  expect(compileCode).toThrow(Error);                 // โœ… Error ํƒ€์ž…
  expect(compileCode).toThrow(new Error('syntax error: missing ;')); // โœ… ์™„์ „ ์ผ์น˜
});

โœ… ์ธ์ž๊ฐ€ ํ•„์š”ํ•œ ํ•จ์ˆ˜

function checkPermission(role) {
  if (role !== 'admin') throw new TypeError('Access denied');
}

test('checkPermission ํ•จ์ˆ˜ ํ…Œ์ŠคํŠธ', () => {
  expect(() => checkPermission('user')).toThrow('Access denied'); // โœ… ๋ฌธ์ž์—ด ํฌํ•จ
  expect(() => checkPermission('user')).toThrow(/Access denied/); // โœ… ์ •๊ทœ์‹
  expect(() => checkPermission('user')).toThrow(TypeError);       // โœ… ํƒ€์ž… ๊ฒ€์‚ฌ
  expect(() => checkPermission('user')).toThrow(new TypeError('Access denied')); // โœ… ํƒ€์ž…+๋ฉ”์‹œ์ง€ ์ผ์น˜
  expect(() => checkPermission('admin')).not.toThrow();           // โœ… ์—๋Ÿฌ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์•ผ ํ•จ
});

โš™๏ธ ์ฃผ์˜

  • expect()์—๋Š” ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ๋ง๊ณ ,
    โ€œํ•จ์ˆ˜ ์ž์ฒด ๋˜๋Š” ๋ž˜ํ•‘ ํ•จ์ˆ˜โ€๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.
    • ์ธ์ž ์—†๋Š” ํ•จ์ˆ˜ โ†’ expect(fn)
    • ์ธ์ž ํ•„์š”ํ•œ ํ•จ์ˆ˜ โ†’ expect(() => fn(args))





โœ… ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

๋งค์ฒ˜์„ค๋ช…์˜ˆ์‹œ
toBe์›์‹œ๊ฐ’ ์ผ์น˜ (===)expect(2+2).toBe(4)
toEqual๊ตฌ์กฐ์  ์ผ์น˜expect({a:1}).toEqual({a:1})
toBeTruthy / toBeFalsyTruthiness ํŒ๋ณ„expect(value).toBeFalsy()
toBeNull / toBeUndefined๋ช…ํ™•ํ•œ null/undefinedexpect(null).toBeNull()
toContain๋ฐฐ์—ด/๋ฌธ์ž์—ด ํฌํ•จexpect(arr).toContain(3)
toThrow์˜ˆ์™ธ ๋ฐœ์ƒ ๊ฒ€์‚ฌexpect(fn).toThrow()

profile
1.01^365

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