UI ํ…Œ์ŠคํŠธ์™€ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ

date
2026-02-10
order
1

์Šค๋ƒ…์ƒท

์ปดํฌ๋„ŒํŠธ์˜ DOM ๊ตฌ์กฐ๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ๊ธฐ๋กํ•˜๊ฑฐ๋‚˜, ์ด๋ฏธ์ง€ ํ˜•ํƒœ๋กœ ๊ธฐ๋กํ•˜๋Š”๊ฒƒ

JsDOM ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๋Š” DOM ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์ด์ „์— ๊ธฐ๋กํ•œ ์Šค๋ƒ…์ƒท๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ๋‹ค.

๊ณผ์ •

  1. ๋Œ€์ƒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.
  2. ์ปดํฌ๋„ŒํŠธ์˜ DOM์„ ์ง๋ ฌํ™”ํ•ด ์Šค๋ƒ…์ƒท์œผ๋กœ ๊ธฐ๋กํ•œ๋‹ค.
  3. ๊ธฐ์กด์˜ ์Šค๋ƒ…์ƒท๊ณผ ์ƒˆ๋กœ์šด ์Šค๋ƒ…์ƒท์„ ๋น„๊ตํ•œ๋‹ค. (๋น„๊ตํ•  ์Šค๋ƒ…์ƒท์ด ์—†๋‹ค๋ฉด ํ˜„์žฌ ์Šค๋ƒ…์ƒท์„ ๊ธฐ๋กํ•˜์—ฌ ๋‹ค์Œ ์Šค๋ƒ…์ƒท๊ณผ ๋น„๊ต.)
  4. ๊ธฐ์กด ์Šค๋ƒ…์ƒท๊ณผ ํ˜„์žฌ ์Šค๋ƒ…์ƒท์ด ๋™์ผํ•œ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ๋Š” ํ†ต๊ณผํ•œ๋‹ค.
  5. ๊ธฐ์กด ์Šค๋ƒ…์ƒท๊ณผ ํ˜„์žฌ ์Šค๋ƒ…์ƒท์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•œ๋‹ค.
  6. ์˜๋„ํ•œ ๋ณ€๊ฒฝ์ผ ๊ฒฝ์šฐ ์Šค๋ƒ…์ƒท์„ ์—…๋ฐ์ดํŠธ(๋‹ค์Œ ๋น„๊ต ๊ธฐ์ค€์ด ๋˜๋„๋ก)ํ•œ๋‹ค.

UI ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ

it('pageTitle ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ(toMatchInlineSnapshot)', async () => {
  const { container } = await render(<PageTitle />);

  expect(container).toMatchInlineSnapshot(`
    <div>
      <h1
        class="MuiTypography-root MuiTypography-h4 css-1lnl64-MuiTypography-root"
      >
        ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ
      </h1>
      <div
        style="position: fixed; z-index: 9999; top: 16px; left: 16px; right: 16px; bottom: 16px; pointer-events: none;"
      />
    </div>
  `);
});
const PageTitle = () => (
  <Typography variant="h4" component="h1" padding="20px 0">
    ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ
  </Typography>
);

์ด๋ ‡๊ฒŒ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๋น„๊ตํ•ด์„œ ์ผ์น˜ํ•˜๋ฉด ํ†ต๊ณผํ•˜๋Š” ๋ฐฉ์‹.

toMatchSnapshot() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋น„๊ต ๊ธฐ์ค€์ด ๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณ„๋„ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

์ผ๋ฐ˜ ํ•จ์ˆ˜

it('๋‹จ์ผ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ํ‚ค์˜ ๊ฐ’์„ ๊ฐ์ฒด์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ค', () => {
    const obj = {
      a: 'A',
      b: { c: 'C' },
      d: null,
    };

    expect(pick(obj, 'a')).toEqual({ a: 'A' });
  });

  it('๋‹จ์ผ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ํ‚ค์˜ ๊ฐ’์„ ๊ฐ์ฒด์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ค(snapshots)', () => {
    const obj = {
      a: 'A',
      b: { c: 'C' },
      d: null,
    };

    expect(pick(obj, 'a')).toMatchInlineSnapshot(`
      {
        "a": "A",
      }
    `);

๋‹น์—ฐํžˆ ์ง๋ ฌํ™”๋œ ๋ฌธ์ž์—ด๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— UI ์ปดํฌ๋„ŒํŠธ ๋ฟ ์•„๋‹ˆ๋ผ ์ผ๋ฐ˜์ ์ธ ์œ ํ‹ธํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋„ ์ด๋ ‡๊ฒŒ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ toEqual ๋กœ ๊ฒ€์ฆํ•˜๋Š”๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€๋ฐ ๊ตณ์ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š”? ๋งŒ์•ฝ ๊ฐ์ฒด ์•ˆ์— ์—ฌ๋Ÿฌ ์†์„ฑ๋“ค์„ ๋น„๊ตํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ํ•œ๋ฒˆ์— ๊ฒ€์ฆํ•˜๋Š”๊ฒŒ ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๋‹ค.