์œ ๋‹›(๋‹จ์œ„) ํ…Œ์ŠคํŠธ๋ž€

date
2025-10-17
order
1

'๋‹จ์œ„ ํ…Œ์ŠคํŠธ'๋ž€?

์•ฑ์—์„œ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์ž‘์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‹คํ–‰ํ•ด ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ.

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

ํ”„๋ก ํŠธ(๋ฆฌ์•กํŠธ)์—์„œ๋Š” ๋ฒ„ํŠผ, ํ…์ŠคํŠธ ์ธํ’‹, ์บ๋Ÿฌ์…€, ์•„์ฝ”๋””์–ธ ๋“ฑ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋‹ค๋ฐ˜์‚ฌ์ธ๋ฐ ์ด๋Ÿฐ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ์•„์ฃผ ์ ํ•ฉํ•œ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. (Atomic ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค)

AAA ํŒจํ„ด

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์—๋„ ์—ฌ๋Ÿฌ ํŒจํ„ด์ด ์žˆ๋‹ค. AAA ํŒจํ„ด์ด๋ž€ Arrange-Act-Assert ํŒจํ„ด์˜ ์ค„์ž„๋ง.

Arrange : ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ™˜๊ฒฝ ๋งŒ๋“ค๊ธฐ (์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํ•˜๋Š” ์ฝ”๋“œ ๋“ฑ)

  • testing-library ์‚ฌ์šฉ Act : ํ…Œ์ŠคํŠธํ•  ๋™์ž‘ ๋ฐœ์ƒ Assert : ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์ด ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ๋˜๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ ๊ฒ€์ฆ
  • vitest ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
it('className prop์œผ๋กœ ์„ค์ •ํ•œ css class๊ฐ€ ์ ์šฉ๋œ๋‹ค.', async () => {
  // Arrange
  // - className์„ ์ง€๋‹Œ ์ปดํฌ๋„ŒํŠธ ๋žœ๋”๋ง
  await render(<TextField className={`my-class`} />);
  
  // Act
  // - ํด๋ฆญ์ด๋‚˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ, prop ๋ณ€๊ฒฝ ๋“ฑ๋“ฑ์— ๋Œ€ํ•œ ์ž‘์—…
  
  // Assert
  // - ๋ Œ๋”๋ง ํ›„ DOM์— ํ•ด๋‹น class๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์ฆ
  expect(screen.getByPlaceholderText('ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.')).toHaveClass(
    'my-class',
  );
});