2. React Testing Library

์‹ค์Šต๋ ˆํฌ

React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉ์ž ์ž…์žฅ์— ๊ฐ€๊น๊ฒŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ.

when, then์˜ ๊ฐœ๋…์ด ์žˆ๋‹ค.

 context('with two numbers', () => {
    it('returns sum of two numbers', () => {
        
        //when
        const result = add(2)

       //then
       expect(result).toBe(2);
    });
  });

์›๋ž˜ ReactDom..createRoot() ์‹์œผ๋กœ ๋”์„ ๋งŒ๋“ค์–ด์„œ ๋ Œ๋”ํ•ด์คฌ๋‹ค๋ฉด

๊ทธ๋Ÿฐ๊ฑฐ ์—†์ด ํŽธํ•˜๊ฒŒ ํ…Œ์ŠคํŒ… ํ•  ์ˆ˜ ์žˆ๋Š” render๋ฅผ ์ œ๊ณตํ•œ๋‹ค.


// TextField.tsx

import { useRef } from 'react';

type TextFiledProps={
    label:string
    placeholder: string
    text:string
    setFilterText:(value:string) => void
}

export default function TextField({
  label, placeholder, text, setFilterText,
}:TextFiledProps) {
  const id = useRef(`input=${Math.random()}`);

  const handleChange = (e:React.ChangeEvent<HTMLInputElement>) => {
    const { value } = e.target;
    setFilterText(value);
  };

  return (
    <div>
      <label htmlFor="input2">
        {label}
      </label>
      <input
        id="input2"
        type="text"
      />
    </div>

  );
}

label text๊ฐ€ Search์ธ ์ธํ’‹์„ ์žก๋Š”๋ฐ,

label์˜ htmlFor์™€ input์˜ id๊ฐ€ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ๋‘˜์ด ์—ฐ๊ฒฐ๋œ Element๋กœ ์ธ์‹ํ•œ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด getByLabelText๋กœ ์ฐพ์ง€ ๋ชปํ•จ.

์™„์ „ํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š์•„๋„ get์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ด์šฉํ•œ๋‹ค.

์•„๋ž˜์ฒ˜๋Ÿผ getํ•ด์˜จ element๋ฅผ ํ…Œ์ŠคํŠธ ํ• ์ˆ˜๋„ ์žˆ๋‹ค.

๋ณ€์ˆ˜์ฒ˜๋ฆฌ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค

event

์—ฌ๊ธฐ๊นŒ์ง€ ์ƒํƒœ์—์„œ ๋ณด๋ฉด handleChange ๋‚ด์—์„œ setFilter ๋“ฑ ์•„๋ฌด๋Ÿฐ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด๋„

ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„์„œ ์•„๋ฌด๋Ÿฐ ์ด์ƒ์ด ์—†๋‹ค.

์ด๊ฒƒ๋„ ์žก์•„์ฃผ๊ณ  ์‹ถ๋‹ค.

setText๊ฐ€ ๋ถˆ๋ ธ๋Š”์ง€ ํ™•์ธํ•˜๊ณ ์‹ถ์–ด

jest.fn ๋ชฉํ‚น

์ด๊ฒƒ๋ณด๋‹ค ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ•œ๋‹ค.

setText๊ฐ€ ๋ถˆ๋ ธ๋Š”์ง€, ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ๊ฒŒ ํ•˜๋Š”์ง€๊นŒ์ง€ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์–ด

setText๊ฐ€ call๋๋Š”์ง€ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

context ํ™œ์šฉ

์ค‘๋ณต๋˜๋Š” render ๋ถ€๋ถ„์„ ๋นผ์ค€๋‹ค

mock clear

์—ฌ๊ธฐ์„œ it('renders elements')์™€

context๋ฅผ ์ด์šฉํ•œ ๋ถ€๋ถ„ ๋‘ ๊ตฐ๋ฐ์—์„œ ๊ฐ์ž ๋”ฐ๋กœ

setText ๋ชฉ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ

์–ด๋””์„œ๋“  ์ฝœ ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์ฝœ ๋œ๊ฑฐ.. ๊ทธ๋Ÿฌ๋ฉด ์•ˆ๋ผ์„œ

๋งค ํ…Œ์ŠคํŠธ๋งˆ๋‹ค ์ดˆ๊ธฐํ™” ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์•„๋ž˜์ฒ˜๋Ÿผ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

context ๋‚ด๋ถ€์—์„œ ๋“œ๋Ÿฌ๋‚ด๊ณ  ์‹ถ์œผ๋ฉด ๊ทธ๋ƒฅ ๋“œ๋Ÿฌ๋‚ด๋„ ์ข‹๋‹ค.

๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ Extract Functionํ•˜๊ณ ,

fireEvent ๋“ฑ์„ ํ†ตํ•ด ์ธํ„ฐ๋ž™์…˜๋งŒ ๊ฒ€์ฆํ•œ๋‹ค.

์™ธ๋ถ€ ์˜์กด์„ฑ์ด ํฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„๋งŒ ๊ฐ€์งœ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค

express ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚ค์ง€ ์•Š๊ณ  mock์„ ํ™œ์šฉํ•ด ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜์ฒ˜๋Ÿผ ๋”ฐ๋กœ ๋นผ์„œ ๋ชฉ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

hooks Mock์„ ์•„์˜ˆ ๋”ฐ๋กœ ๋บ„ ์ˆ˜ ์žˆ๋‹ค

jest.fn์—†์ด () => fixtures.products ๋งŒ ์จ์ค˜๋„ ๊ฐ€๋Šฅ.

๊ทธ๋ ‡์ง€๋งŒ ์จ์ฃผ๋ฉด ๊ฐ€์งœ๋ผ๋Š” ์‚ฌ์‹ค์ด ๋” ๋ช…ํ™•ํ•˜๊ณ 

ํ˜ธ์ถœ์ด ๋๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋“ฑ์˜ test๋ฅผ ๋˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ™์ด๋Š” ํŽธ์„ ์ถ”์ฒœ.

์ ์  ์•ฑ์ด ์ปค์ง€๋ฉด์„œ ํ•˜๋‚˜์”ฉ ๊ฐ€์งœ ๊ตฌํ˜„์œผ๋กœ ํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ๊ฐ€ ์žˆ๋‹ค.

์ด๋Ÿด๋•Œ MSW๋“ฑ์˜ ๋Œ€์•ˆ์„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ์ฃผ์ œ๋กœ ๋„˜์–ด๊ฐ€ ๋ณด์ž.

Last updated