2.React Testing library

React Testing Library

React Testing Library๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ React ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ํ…Œ์ŠคํŠธ ์œ ํ‹ธ๋ฆฌํ‹ฐ์ด๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ DOM์„ ์ฟผ๋ฆฌํ•˜๊ณ  ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” DOM ํ…Œ์ŠคํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ„์— ๊ตฌ์ถ•๋œ๋‹ค.

React Testing Library๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์•„๋‹Œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋™์ž‘์— ์ดˆ์ ์„ ๋งž์ถ˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. ์ฆ‰, ํŠน์ • ์š”์†Œ๋‚˜ ์Šคํƒ€์ผ์˜ ์กด์žฌ์™€ ๊ฐ™์€ ํŠน์ • ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋Œ€์‹  ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ ๋ฐ ํ•ด๋‹น ์ƒํƒœ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

React Testing Library๋Š” DOM์„ ์ฟผ๋ฆฌํ•˜๊ณ  render, fireEvent ๋ฐ waitFor์™€ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ จ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋‹จ์ถ” ํด๋ฆญ ๋˜๋Š” ์–‘์‹์— ํ…์ŠคํŠธ ์ž…๋ ฅ๊ณผ ๊ฐ™์€ ๊ตฌ์„ฑ ์š”์†Œ์™€์˜ ์‚ฌ์šฉ์ž ์ƒํ˜ธ ์ž‘์šฉ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ์ƒํ˜ธ ์ž‘์šฉ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

React Testing Library๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ React ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๋ณด๋‹ค ์•ˆ์ •์ ์ด๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋™์‹œ์— ๋ณด๋‹ค ์‚ฌ์šฉ์ž ์ค‘์‹ฌ์ ์ธ ํ…Œ์ŠคํŠธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ด‰์ง„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ์•„๋‹Œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋™์ž‘์— ์ดˆ์ ์„ ๋งž์ถค์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์— ๋” ํƒ„๋ ฅ์ ์ด๊ณ  ์ตœ์ข… ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ์™€ ๊ธฐ๋Œ€์— ๋” ์ž˜ ๋ถ€ํ•ฉํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

The more your tests resemble the way your software is used, the more confidence they can give you. - RTL ๊ณต์‹๋ฌธ์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์†Œํ”„ํŠธ์›จ์–ด ์‚ฌ์šฉ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ• ์ˆ˜๋ก ๋” ๋งŽ์€ ์‹ ๋ขฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

React Testing Library๋Š” UI์— ํŠนํ™”๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

RTL์€ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๋„๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ๋ณธ์ ์œผ๋กœ CRA์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค. ๋งŒ์•ฝ CRA๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ง์ ‘ ์„ค์ •ํ•œ๋‹ค๋ฉด npm install --save-dev @testing-library/react ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค.

test('Greeting', () => {
 render(<Greeting name='world' />);

 const text = screen.getByText(/Hello, world/);
 expect(text).toBeInTheDocument();
});

์ฟผ๋ฆฌ ํƒ€์ž…

  • get - ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ํƒ€๊ฒŸ์„ ์ฐพ์ง€ ๋ชปํ•  ์‹œ ์—๋Ÿฌ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค.

  • find - ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ํƒ€๊ฒŸ์„ ์ฐพ์ง€ ๋ชปํ•  ์‹œ ์—๋Ÿฌ๋ฅผ ๋˜์ง‘๋‹ˆ๋‹ค.

  • query - ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ํƒ€๊ฒŸ์„ ์ฐพ์ง€ ๋ชปํ•  ์‹œ null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Action, Assertion, ๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ ๋“ฑ๋“ฑ ์ด ๋ถ€๋ถ„๋„ ์•ž์œผ๋กœ ๊ฐ•์˜๊ฐ€ ์ง„ํ–‰๋˜๋ฉด์„œ ๋ฌด๋ถ„๋ณ„ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๋ณด๋‹ค ์ •๋ง ํ•„์š”ํ•œ ๋ถ€๋ถ„์— ํ…Œ์ŠคํŠธ๊ฐ€ ๋“ค์–ด๊ฐ€๋„๋ก ๊ณ ๋ฏผํ•˜๋ฉด์„œ ์ง„ํ–‰ํ•ด ๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

Given-When-Then ํŒจํ„ด

GWT(Given-When-Then) ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŠธ๋ฅผ ๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ํŒจํ„ด์€ ํ–‰๋™ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ(BDD) ๋ฐ ์Šน์ธ ํ…Œ์ŠคํŠธ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜์ง€๋งŒ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ ๊ธฐํƒ€ ํ˜•ํƒœ์˜ ์ž๋™ ํ…Œ์ŠคํŠธ์—๋„ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

GWT ํŒจํ„ด์€ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  1. Given: ์ด ์„น์…˜์—์„œ๋Š” ํ…Œ์ŠคํŠธ์˜ ์ „์ œ ์กฐ๊ฑด์„ ์„ค๋ช…ํ•œ๋‹ค. ํ…Œ์ŠคํŠธ ์ค‘์ธ ์‹œ์Šคํ…œ ๋˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ๋ฅผ ์ •์˜ํ•˜์—ฌ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋  ์ปจํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

  2. When: ์ด ์„น์…˜์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์ค‘์ธ ๋™์ž‘์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์ž‘์—… ๋˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์„ค๋ช…ํ•œ๋‹ค. ์ด๋Š” ํ…Œ์ŠคํŠธ ์ค‘์ธ ํŠน์ • ์ž…๋ ฅ ๋˜๋Š” ์ž‘์—…์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์ข…์ข… ํ…Œ์ŠคํŠธ ์ค‘์ธ ์‹œ์Šคํ…œ์—์„œ ํ•จ์ˆ˜ ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ๋‹ค.

  3. Then: ์ด ์„น์…˜์—์„œ๋Š” ํ…Œ์ŠคํŠธ์˜ ์˜ˆ์ƒ ๊ฒฐ๊ณผ ๋˜๋Š” ๋™์ž‘์„ ์„ค๋ช…ํ•œ๋‹ค. ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ •์˜๋œ ์ž…๋ ฅ ๋˜๋Š” ์ž‘์—…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ์ถœ๋ ฅ ๋˜๋Š” ๋™์ž‘์„ ์ง€์ •ํ•œ๋‹ค.

describe('sum function', () => {
  test('Given two positive numbers, when the sum function is called with those numbers, then the result should be the sum of the two numbers', () => {
    // Given
    const a = 2;
    const b = 3;

    // When
    const result = sum(a, b);

    // Then
    expect(result).toBe(5);
  });
});

GWT ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŠธ๋ฅผ ๋”ฐ๋ผํ•˜๊ธฐ ์‰ฌ์šด ๊ฐœ๋ณ„ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŠธ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๊ฐ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ํŠน์ • ์ž…๋ ฅ, ์ž‘์—… ๋ฐ ์˜ˆ์ƒ ๊ฒฐ๊ณผ๋ฅผ ์‰ฝ๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ–ฅํ›„ ํ…Œ์ŠคํŠธ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ฑฐ๋‚˜ ์œ ์ง€ ๊ด€๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Mocking

๋ชจํ‚น์€ ์ฝ”๋“œ ๋‹จ์œ„๋ฅผ ๊ฒฉ๋ฆฌํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ๋‹จ์œ„๊ฐ€ ์˜์กดํ•˜๋Š” ๋ณต์žกํ•œ ์‹œ์Šคํ…œ ๋˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋™์ž‘์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•ด ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ด ๊ธฐ์ˆ ์—๋Š” ์‹ค์ œ ๊ฐœ์ฒด์˜ ๋™์ž‘์„ ๋ชจ๋ฐฉํ•˜๋Š” ๊ฐ€์งœ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ค‘์— ์‹ค์ œ ๊ฐœ์ฒด๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์ž‘์—…์ด ํฌํ•จ๋œ๋‹ค.

๋ชจํ‚น ํ”„๋กœ์„ธ์Šค์—๋Š” ์‹ค์ œ ๊ฐœ์ฒด์˜ ๋™์ž‘์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์ง€๋งŒ ๋‹จ์ˆœํ™”๋˜๊ฑฐ๋‚˜ ๋ฏธ๋ฆฌ ๊ฒฐ์ •๋œ ๋™์ž‘์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ์˜ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด ํฌํ•จ๋œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชจ์˜ ๊ฐœ์ฒด๋Š” ํ…Œ์ŠคํŠธ ์ค‘์ธ ๋‹จ์œ„์˜ ์ปจํ…์ŠคํŠธ์—์„œ ์‹ค์ œ ๊ฐœ์ฒด์˜ ๋™์ž‘์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋Š” ๋ชจ์˜ ๊ฐœ์ฒด์˜ ๋™์ž‘์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค.

ํ…Œ์ŠคํŠธ์—์„œ ์กฐ๋กฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์ด์ ์ด ์žˆ๋‹ค.

  1. ๊ฒฉ๋ฆฌ(Isolation): ๋ณต์žกํ•œ ์™ธ๋ถ€ ์ข…์†์„ฑ์„ ๋ชจ์˜ ๊ฐœ์ฒด๋กœ ๋Œ€์ฒดํ•˜๋ฉด ์™ธ๋ถ€ ์‹œ์Šคํ…œ์˜ ๋™์ž‘์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š” ์—†์ด ์ฝ”๋“œ๋ฅผ ๊ฒฉ๋ฆฌํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ์ œ์–ด(Control): ๋ชจ์˜ ๊ฐœ์ฒด๋Š” ํŠน์ • ๋™์ž‘์ด๋‚˜ ์‘๋‹ต์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋„๋ก ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ์ค‘์ธ ์‹œ์Šคํ…œ์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ์†๋„(Speed): ๋ชจํ‚น์„ ์‚ฌ์šฉํ•˜๋ฉด ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค์˜ ํ•„์š”์„ฑ์„ ์ค„์ด๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

import axios from 'axios';

function fetchData(url) {
  return axios.get(url)
    .then(response => response.data)
    .catch(error => console.error(error));
}

test('fetchData should return the correct data', () => {
  const mockData = { id: 1, name: 'John' };
  const mockedAxios = jest.spyOn(axios, 'get').mockResolvedValue({ data: mockData });

  return fetchData('/api/data')
    .then(data => {
      expect(data).toEqual(mockData);
      expect(mockedAxios).toHaveBeenCalledWith('/api/data');
    });
});

์ด ์˜ˆ์—์„œ๋Š” axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ API์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” fetchData๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ๋‹ค. fetchData ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด Jest ๋ชจํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋™์ž‘์„ ์‹œ๋ฎฌ๋ ˆ์ดํŠธํ•œ๋‹ค.

axios.get ํ•จ์ˆ˜๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๋ชจ์˜ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” jest.spyOn ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ axios์— ๋Œ€ํ•œ ๋ชจ์˜ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ mockResolvedValue ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ์˜ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ์—์„œ ๋ชจ์˜ โ€‹โ€‹URL๋กœ fetchData ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  expect ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๋˜ํ•œ toHaveBeenCalledWith ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ์˜ axios.get ํ•จ์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ URL๋กœ ํ˜ธ์ถœ๋˜์—ˆ์Œ์„ ํ™•์ธํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ์—์„œ ๋ชจ์˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋™์ž‘์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š” ์—†์ด fetchData ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ๊ฒฉ๋ฆฌํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

Test fixture

Test fixture๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ํ…Œ์ŠคํŠธ์˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์‹œ์Šคํ…œ์˜ ๊ณ ์ • ์ƒํƒœ์ด๋‹ค. ํŠน์ • ์ฝ”๋“œ ์กฐ๊ฐ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๋ ค์ง„ ์‹œ์ž‘์ ์„ ์ œ๊ณตํ•˜๋Š” ์„ค์ •์ด๋ฉฐ ํ…Œ์ŠคํŠธ ์ค‘์ธ ์ฝ”๋“œ๊ฐ€ ์•Œ๋ ค์ง„ ์กฐ๊ฑด์—์„œ ์ผ๊ด€๋˜๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค.

Test fixture์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ, ๊ฐœ์ฒด ๋˜๋Š” ๊ธฐํƒ€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋น„๋กฏํ•œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์„ค์ •์ด ํฌํ•จ๋œ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™”, ํŒŒ์ผ ์‹œ์Šคํ…œ ์„ค์ •, ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ๋ฐ ๋ชจ์˜ ๊ฐœ์ฒด ์„ค์ •์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค.

Test fixture์˜ ๋ชฉ์ ์€ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๋ ค์ง„ ํ†ต์ œ๋œ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค๊ณ  ์™ธ๋ถ€ ์š”์ธ์ด ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋ฌธ์ œ๋‚˜ ์ด์Šˆ๊ฐ€ ๋” ์‹ฌ๊ฐํ•ด์ง€๊ธฐ ์ „์— ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์œ„ ํ…Œ์ŠคํŠธ์—์„œ Test fixture๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์ƒ์„ฑ๋˜๋ฉฐ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์กฐ๊ฑด์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์ผ๊ด€๋œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.

describe('sum function', () => {
  let a, b;

  beforeEach(() => {
    a = 2;
    b = 3;
  });

  test('should return the sum of two numbers', () => {
    const result = sum(a, b);
    expect(result).toBe(5);
  });

  test('should return a number', () => {
    const result = sum(a, b);
    expect(typeof result).toBe('number');
  });
});

์ด ์˜ˆ์ œ์—์„œ๋Š” ๋‘ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์•„ ํ•ฉ๊ณ„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•ฉ์‚ฐ ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ ํ”ฝ์Šค์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ a์™€ b์˜ ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ํ•ฉ๊ณ„ ํ•จ์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๋ ค์ง„ ์‹œ์ž‘์ ์„ ํ™•๋ณดํ•˜๊ณ  ์žˆ๋‹ค.

๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— beforeEach ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ a์™€ b์˜ ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž…๋ ฅ๊ณผ ์„ค์ •์œผ๋กœ ์ผ๊ด€๋œ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ Jest์—์„œ ์ œ๊ณตํ•˜๋Š” ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ•ฉ๊ณ„ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ a์™€ b์˜ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ๊ธฐ๋Œ€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ฉ๊ณ„ ํ•จ์ˆ˜์˜ ๋™์ž‘์— ๋Œ€ํ•œ ์–ด์„ค์…˜์„ ๋งŒ๋“ ๋‹ค.

5์ฃผ์ฐจ ํ…Œ์ŠคํŠธ๋ฅผ ๋งˆ์น˜๋ฉด์„œ

์œ„์˜ ํ‚ค์›Œ๋“œ๋“ค์ด ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋ฉด์„œ ํšจ์œจ์žˆ๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ๋งŽ์€ ๋„์›€์„ ์ฃผ๋Š” ๊ฒƒ์„ ๋Š๋ผ๊ฒŒ ๋˜์—ˆ๋‹ค. ์•ž์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ๋” ๋งŽ์ด ์ง„ํ–‰ํ•ด ๋ด์•ผ ์•Œ๊ฒ ์ง€๋งŒ 5์ฃผ์ฐจ ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ mocking ์ž‘์—… ๋ฐ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” hooks๋ฅผ ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธ์— ์ž˜ ์—ฐ๊ฒฐ์‹œ์ผœ ์ค„ ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•ด์„œ๋„ ๋งŽ์ด ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๋˜ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์•„์ง์€ ์–ด๋ ต์ง€๋งŒ ์ง€์†ํ•˜๋‹ค๋ณด๋ฉด ๋” ์ข‹์€ ๊ตฌ์กฐ์™€ ์ข‹์€ ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ์ด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

Last updated