inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실무에 바로 적용하는 프런트엔드 테스트 - 1부. 테스트 기초: 단위・통합 테스트

3.3. 리액트 훅 테스트(feat. act 함수)

act 함수와 renderHook 함수 내 rerender 차

해결된 질문

420

foreverchoi0706

작성한 질문수 2

1

 

안녕하세요 궁금한게 있습니다. act 함수에 대해 이해했는데 act 함수없이 아래와 같이 해도 테스트가 통과되더라구요. 혹시 차이가 있을까요?

it('훅의 toggleIsModalOpened()를 호출하면 isModalOpened 상태가 toggle된다.', () => {
  const { result, rerender } = renderHook(useConfirmModal);
  result.current.toggleIsModalOpened();
  rerender();
  expect(result.current.isModalOpened).toBe(true);
}); 

javascript react 소프트웨어-테스트 vitest

답변 1

0

코드 조커, 오프

안녕하세요!

우선 강의의 내용을 먼저 정리해보면, act API의 경우 상호 작용(렌더링, 이펙트 등...)을 함께 그룹화하고 실행해 리렌더링과 업데이트가 실제 앱이 동작하는 것과 유사한 방식으로 동작합니다.

테스트에서 검증하고자 하는 내용은 toggleIsModalOpened() 메서드가 실행하면 훅 내의 state가 제대로 업데이트 되는지, 즉 위에서 언급한 것 처럼 상호 작용등이 한 번에 실행되어 원하는 상태로 업데이트 되는지를 검증하는 테스트이기 때문에 act API를 사용하는 것이 적합하다고 할 수 있습니다.

rerender 함수 또한 강의에서 간단하게 언급드리긴 했지만, 원하는 인자와 함께 같은 컨테이너 내에서 새로 호출해 상태를 업데이트 하는 함수입니다. 주로 prop 변경에 따른 컴포넌트의 상태를 검증할 때 사용하곤 합니다. 이런 맥락에서, toggleIsModalOpened()를 호출한 뒤 rerender()를 명시적으로 호출한 뒤의 상태를 검증하는 흐름 자체가 테스트 내용에 적합한 동작의 흐름이라고 보기는 조금은 어색하게 느껴집니다.


관련해서 강의에서 언급하는 것처럼 테스트는 사용자의 실제 사용과 유사하게 테스트 할 수록 신뢰도가 올라간다고 말씀드리고 있는데요. 실제로 RTL 가이드 문서에서 rerender에 대한 설명(https://testing-library.com/docs/react-testing-library/api/#rerender)에는 (훅이 아닌 컴포넌트의 rerender에 해당하는 설명이지만, 동일한 맥락인 것 같습니다.) prop 업데이트를 올바르게 수행하는지를 검증하는 것을 권장하지, 구현 개념의 rerender를 사용해 prop에 따른 컴포넌트 세부 구현상황이 변경되는 것을 검증하는 것을 권장하지 않는다고 하고 있습니다. 현재 상황과 완벽하게 매칭되는 이야기는 아닐지라도 각 API의 목적에 맞게 테스트를 작성한 뒤 검증해야 테스트의 목적에 맞는 결과를 얻을 수 있을 것이라 생각합니다.

 

설명이 부족했다면 추가로 댓글 남겨주세요! 좋은 질문 감사합니다. 😃

mockZustand

0

67

2

프로젝트 세팅 오류 및 버전 오류 문제 문의

0

97

2

toggleIsModalOpened 테스트 할때 궁금한 점이 있습니다.

0

43

2

로딩/에러처리 검증은 어떻게 하는게 좋을까요?

0

65

1

통합 테스트에서 API 요청에 대한 검증은 이루어지지 않아도 괜찮을까요?

0

71

2

lint에러..

0

74

1

단언문 순서에 따라 테스트 결과가 왜 달라지나요?

0

109

2

useNavigate 테스트 시, 검증 대상 질문입니다.

0

113

2

강의 예시프로젝트 업데이트좀 부탁드립니다.

2

166

2

통합테스트와 단위테스트 파일 분리

0

109

1

grid 양옆에 margin은 어디서 설정되어있는건가요 ?

0

131

1

vitest 설치했는데

0

207

2

2부 할인쿠폰 관련

0

177

1

에러 해결 방법

0

407

2

직접 구현한 atom 컴포넌트 테스트 범위 질문

0

175

1

setup, teardown 동작 순서

0

212

1

debounce 함수 테스트 정확도 관련 질문입니다.

0

177

2

ProductFilter test 어떤 방식이 더 선호되는 방식일까요?

0

204

2

통합 테스트 작성 방식에 대해 궁금한 점이 있습니다

0

259

2

vitest Extension 알려주세요.

0

268

1

2.1 강의 질문있습니다.

0

140

1

useNavigate()을 검증할 때 이해가 안되는 부분이 있습니다.

0

248

2

toHaveStyle 메서드 사용이 조금 이상한 것 같습니다.

0

196

2

TestPayment에 쿠폰 정보를 prop으로 전달하는 이유

0

186

2