๐Ÿ’œVitest | ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ

์›์˜ยท2024๋…„ 1์›” 22์ผ
0
post-thumbnail

๐Ÿ’œ๊ฐ€์ƒ DOM์—์„œ ์š”์†Œ ์ฐพ๊ธฐ

โšกscreen

  • render์—์„œ ์ƒ์„ฑ๋œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜๋œ DOM์— ์—‘์„ธ์Šค ๊ฐ€๋Šฅ

โšกscreen query methods

  • ํ˜•์‹
command[All]By{QueryType}
  • command
    • get : ์š”์†Œ๊ฐ€ DOM ๋‚ด์— ์žˆ์„ ๊ฒƒ expect
    • query : ์š”์†Œ๊ฐ€ DOM ๋‚ด์— ์žˆ์ง€ ์•Š์„ ๊ฒƒ expect
    • find : ์š”์†Œ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚  ๊ฒฝ์šฐ expect -> DOM์— ๋น„๋™๊ธฐ์ ์ธ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆด ๋•Œ ์œ ์šฉ
  • [All]
    • ํฌํ•จ : ํ•˜๋‚˜ ์ด์ƒ์˜ ๋งค์น˜ expect -> ์ „์ฒด ๋ฐฐ์—ด ๋ฐ›์Œ
    • ๋ฏธํฌํ•จ : ํ•˜๋‚˜์˜ ๋งค์น˜๋งŒ expect
  • {QueryType}
    • ๋ฌด์—‡์œผ๋กœ ๊ฒ€์ƒ‰ ํ•˜๋Š”์ง€
    • Role : ์—ญํ• , ์ ‘๊ทผ์„ฑ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์šฐ์„ ์‹œ
    • AltText
    • Text
    • PlaceholderText
    • LabelText
    • DisplayValue

โšกquery methods ์š”์†Œ ์ฐพ์„ ๋•Œ ์šฐ์„ ์ˆœ์œ„

  • ์ ‘๊ทผ์„ฑ ๊ณ ๋ คํ•ด์„œ ์š”์†Œ ์ฐพ๊ฑฐ๋‚˜ ๋ณด์กฐ ๊ธฐ์ˆ (์Šคํฌ๋ฆฐ ๋ฆฌ๋”)๋กœ ์š”์†Œ ์ฐพ๋Š”๊ฑธ ๊ถŒ์žฅ(๊ณต์‹๋ฌธ์„œ)

1์ˆœ์œ„) ๋‹ค ์ ‘๊ทผ ๊ฐ€๋Šฅ

  • getByRole : ํŽ˜์ด์ง€์—์„œ ์š”์†Œ ์—ญํ• ์„ ์‹๋ณ„(button, heading) (์ฐธ๊ณ ๋ฌธ์„œ)
    • ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์—ญํ•  ๋ชฉ๋ก or role="" ํ˜•์‹์œผ๋กœ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
    • name ์˜ต์…˜{ name : } ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ์—ญํ• ์„ ๊ฐ€์ง„ ์š”์†Œ๋“ค ์ค‘ ํŠน์ • ์š”์†Œ ์„ ์ •
    • logRoles : render ๋œ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ์–ด๋–ค role์ด ์กด์žฌํ•˜๋Š”์ง€ ๋ณด์—ฌ์คŒ
      const { container } = render(<App />);
      logRoles(container);
  • getByLabelText : ํผ์— ๊ด€ํ•ด ํ•ด๋‹น ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ํผ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉ
  • getByPlaceholderText : ์ž…๋ ฅ ์š”์†Œ์— ๊ด€ํ•ด
  • getByText : ๋Œ€ํ™”ํ˜•์ด ์•„๋‹Œ ๋””์Šคํ”Œ๋ ˆ์ด ์š”์†Œ
    • ํ™”๋ฉด์— ์กด์žฌํ•˜์ง€ ์•Š์Œ์„ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ
    • getByText ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํ…์ŠคํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ
    • queryByText ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด null์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ not.toBeInTheDocument() ์‚ฌ์šฉ ๊ฐ€๋Šฅ
      // ์—๋Ÿฌ ๋ฐœ์ƒ
      expect(screen.getByText("ํ™”๋ฉด์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ…์ŠคํŠธ")).not.toBeInTheDocument();
      // ํ†ต๊ณผ
      expect(screen.queryByText("ํ™”๋ฉด์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ…์ŠคํŠธ")).not.toBeInTheDocument();
  • getByDisplayValue : ํŠน์ • ๊ฐ’์ด ํผ ์š”์†Œ ์ž…๋ ฅ ํ•„๋“œ์— ํ‘œ์‹œ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉ

2์ˆœ์œ„) ์‹œ๋งจํ‹ฑ ์ฟผ๋ฆฌ

  • 1๋ฒˆ์—์„œ ์–ด๋Š ๊ฒƒ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ์‹œ ์‚ฌ์šฉ
  • getByAltText : ์ด๋ฏธ์ง€ ๊ด€๋ จ ์š”์†Œ
  • getByTitle : ํƒ€์ดํ‹€ ๊ด€๋ จ ์š”์†Œ

3์ˆœ์œ„) test id

  • ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ตœํ›„ ์ˆ˜๋‹จ์œผ๋กœ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜๋„ ์—†๊ณ  ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๋„ ์•ก์„ธ์Šค ๋ถˆ๊ฐ€๋Šฅ
  • getByTestId : ํ•ด๋‹น test id๋ฅผ ๊ฐ€์ง„ ์š”์†Œ

๐Ÿ’œ์œ ์ € ์ด๋ฒคํŠธ ์‹œ๋ฎฌ๋ ˆ์ด์…˜

  • fireEvent
    • @testing-library/react์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ์ด๋ฒคํŠธ๋ฅผ ๊ฐ•์ œ๋กœ ๋ฐœ์ƒ
    • ์ผ๋ฐ˜์ ์œผ๋กœ DOM ์š”์†Œ์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ
    • ํ…Œ์ŠคํŠธํ•˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž์˜ ์‹ค์ œ ์ƒํ˜ธ์ž‘์šฉ์„ ๋ชจ๋ฐฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ด๋ฒคํŠธ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰
  • userEvent
    • @testing-library/user-event ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ๋ฅผ ๋” ์™„์ „ํ•˜๊ณ  ํ˜„์‹ค์ ์œผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
    • ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์†Œ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธ
    • setup ๋ฉ”์„œ๋“œ์—์„œ ๋ฐ˜ํ™˜๋ฐ›๋Š” ๊ฐ’์œผ๋กœ user ๊ฐ์ฒด ์ •์˜
const user = userEvent.setup();
  • ํ•ญ์ƒ Promise ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœ ์‹œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ•„์š”
await user.click(๋ฒ„ํŠผ);

๐Ÿ’œAssertion(๋‹จ์–ธ)

  • ์ฐพ์€ ์š”์†Œ๋กœ ์œ ์ € ์ด๋ฒคํŠธ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‹œํ‚จ ํ›„
    ์ฝ”๋“œ๋‚˜ ์‹œ์Šคํ…œ์˜ ํŠน์ • ๋ถ€๋ถ„์ด ๊ธฐ๋Œ€ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ๊ฒ€์ฆ

โšกjest-dom ์˜ ๋‹จ์–ธ

  • ์ฐธ๊ณ  ๊ณต์‹๋ฌธ์„œ
  • ๋ฒ„ํŠผ : toBeEnabled(), toBeDisabled()
  • ์ฒดํฌ๋ฐ•์Šค : toBeChecked()
  • ๋ถ€์ •์˜ ์Œ์ด ์—†๋Š” ๊ฒฝ์šฐ ๋‹จ์–ธ ์•ž์— not ์‚ฌ์šฉ
profile
ํ™”์ดํŒ…~~^ใ…^/

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