2. React Testing Library

실습레포arrow-up-right

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