개발자
요즘 테스팅에 관심이 생겨서 기존에 있던 프로젝트로 유닛 테스트를 하나씩 해보고 있습니다. 유닛테스트 중 어떻게 테스트하는게 좋은 방법인지 궁금해서 질문드립니다 아래와 같은 카테고리 컴포넌트에서 React-Query를 사용하고 있습니다. 별로의 useQuery를 커스텀 훅으로 분리시켜놓은 상태이구요. 다음 컴포넌트를 유닛테스트 한다고 했을때, useCategoryQuery hook과 ui 부분에 대한 테스트는 별도로 분리시켜야 하는걸까요?? 분리해야 한다고 했을 때에는 useCategoryQuery 훅은 모킹하는게 맞는 부분인가요?? useQuery를 테스팅 하는 래퍼런스를 찾아봤는데 useQuery에 대한 테스트만 진행하는 로직 같아서 아리송해서 질문드립니다ㅠㅠ!
1const Category = ({ genre, setGenre }: IProps) => {
2 const {
3 getCategory: { data, isLoading, isError, error },
4 } = useCategoryQuery();
5
6 if (isLoading) {
7 return (
8 <Category>
9 {Array.from({ length: 7 }).map((_, idx: number) => (
10 <Placeholder key={idx} />
11 ))}
12 </Category>
13 );
14 }
15 return (
16 <Category>
17 <>
18 <li
19 data-testid="category-item"
20 onClick={() => setGenre(null)}
21 className={genre === null ? "active" : ""}
22 >
23 전체
24 </li>
25 {data?.map((item) => (
26 <li
27 data-testid="category-item"
28 onClick={() => setGenre(item.id)}
29 className={item.id === genre ? "active" : ""}
30 key={item.id}
31 >
32 {item.name}
33 </li>
34 ))}
35 </>
36 </Category>
37 );
38};
39
40export default Category ;
답변 2
개인적으로는 컴포넌트에 대한 테스트와 useCategoryQuery 훅에 대한 테스트를 별도로 진행할 것 같습니다. 또한 컴포넌트를 테스트 할 때 훅은 모킹할 것 같구요. 왜냐하면, 유닛테스트를 할 때에, 각 모듈에 대한 테스트 결과는 외부 모듈의 영향을 최소화 하여야 한다고 생각합니다. Category 컴포넌트에 대한 테스트는 말 그대로, 해당 컴포넌트 내의 로직들이 잘 동작하는지를 테스트 하는 것입니다. 그런데 이 결과값이, 외부 모듈인 useCategoryQuery에 의해 변동 될 수 있다면 만약 테스트 실패시 그 이유가 Category 컴포넌트로 인한 것인지, useCategoryQuery에 의한 것인지 알기 어려울 수 있지 않을까요? 그렇기 때문에 저는 유닛 테스트를 작성할 때에는 가급적 외부 모듈은 모두 정상적인 값을 반환한다는 가정 하에 모킹을 진행하고, 내부 로직에 의해서만 케스트 값이 결정되도록 테스트 코드를 작성하는 편입니다!
유닛 테스트에 대해 질문 주셔서 감사합니다. 유닛 테스트에서는 테스트 대상을 작은 단위로 분리하여 독립적으로 테스트하는 것이 일반적입니다. 따라서, 위의 컴포넌트를 유닛 테스트한다고 했을 때, 'useCategoryQuery' 훅과 UI 부분을 별도로 분리하여 테스트하는 것이 좋습니다. 'useCategoryQuery' 훅을 분리하여 테스트하려면, 해당 훅을 모킹하는 것이 일반적인 방법입니다. 모킹을 통해 원하는 데이터나 동작을 가정하여 테스트할 수 있습니다. 예를 들어, 테스트를 위해 가짜 데이터를 반환하도록 모킹하거나, 특정 상황에서 에러를 발생시키도록 모킹하는 등의 작업을 할 수 있습니다. UI 부분에 대해서도 별도로 분리하여 테스트하는 것이 좋습니다. 예를 들어, 'isLoading'이 'true'인 경우 Placeholder 컴포넌트가 렌더링되는지, data가 정상적으로 렌더링되는지, 클릭 이벤트가 올바르게 동작하는지 등을 테스트할 수 있습니다. React Testing Library(RTL)를 사용하신다면, 'render' 함수로 컴포넌트를 렌더링하고, 'screen' 객체를 사용하여 특정 엘리먼트를 찾아 테스트할 수 있습니다. 예를 들어, 'screen.getByTestId'로 'category-item' 테스트 ID를 가진 엘리먼트를 찾아서 클릭 이벤트를 시뮬레이트하고, 결과를 검증할 수 있습니다. 위와 같이 테스트를 분리하고 모킹하여 유닛 테스트를 수행하면, 특정 기능이나 로직에 집중하여 테스트할 수 있고, 유지보수가 용이해집니다.
커리어리 AI 봇의 답변을 평가해 주세요!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!