[6팀 김수현] Chapter 3-1. 프론트엔드 테스트 코드#20
Open
suhyeon57 wants to merge 8 commits intohanghae-plus:mediumfrom
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Medium
7주차 과제 체크포인트
기본과제
Medium
질문
mocking을 사용하는 이유
--> 실제 DB나 외부 환경에 영향을 주지 않고, 독립적이고 빠른 테스트를 하기 위함입니다.
vi.fn()은 호출 여부와 인자를 추적할 수 있는 mock 함수를 만들 때 사용합니다.
vi.mock('notistack', …)은 notistack 모듈을 테스트 환경에서 가짜 버전으로 바꿔치기하는데,
이렇게 하면 useSnackbar가 반환하는 enqueueSnackbar가 실제 스낵바를 띄우는 대신,
우리가 만든 mock 함수(toastFn)를 실행하게 됩니다.
따라서, 테스트에서는 expect(toastFn).toHaveBeenCalledWith('일정 삭제 실패', { variant: 'error' });처럼
UI 동작 대신 호출 자체와 전달된 메시지만 검증할 수 있습니다.
따라서, 테스트에서 expect(enqueueSnackbarFn).toHaveBeenCalledWith('일정 삭제 실패', { variant: 'error' }); 같은 검증을 할 수 있다.
네, 의미가 있습니다. 테스트는 실제 동작하는 화면과 최대한 유사해야 정확해집니다.
ChakraProvider는 Chakra UI의 테마와 context를 제공하기 때문에, 이를 테스트에서 함께 적용하면 실제 UI 환경과 동일한 조건에서 컴포넌트를 검증할 수 있습니다.
심화 과제
과제 셀프회고
테스트 코드 작성 후 통과하면 짜릿하다는 기분을 느낄 수 있다고 했는데 정말 느꼈습니다.. ai를 사용하지 않고 함수들이 어디에서 어떻게 쓰이는지 직접 확인해 가면서 테코를 작성하니 시간이 많이 걸렸지만, 재미를 느꼈던 것 같습니다.
실무에서는 테코를 작성하지 않아서 항상 코드를 수정, 추가하려고 할 때 다른 곳에서 에러가 나지 않을까 생각하며 조심스럽게 수정해나가는데 테코를 작성하면 마음 놓고 수정할 수 있지 있겠다라고 생각했고, 시간이 된다면 실무 테코도 작성해보고 싶습니다.
기술적 성장
renderHook 사용 경험
처음에 커스텀 훅을 테스트하려고 했을 때, 훅을 직접 호출했더니 오류가 발생했습니다.
검색해보니, 테스트 환경에서는 훅을 직접 호출할 수 없고, react-testing-library의 renderHook을 사용해야 한다는 것을 알게 되었습니다.
renderHook은 훅을 호출하고, 훅이 반환하는 현재 값과 메서드를 result.current를 통해 접근할 수 있도록 해줍니다.
이를 통해 훅의 상태와 메서드를 안전하게 테스트하며, 원하는 동작을 검증할 수 있었습니다.
act ()의 사용
테스트 코드에서 훅을 검증하던 중 navigate('prev')를 호출했을 때, 상태가 업데이트되지 않는 문제가 있었습니다.
처음에는 단순히 result.current.navigate('prev')만 호출하면 currentDate가 즉시 바뀔 거라고 생각했습니다. 하지만 실제로는 리액트 상태 업데이트가 비동기적이며, Testing Library는 모든 상태 변경을 act()로 감싸야 안전하게 반영된다는 규칙이 있었습니다.
그래서 아래처럼 act()로 감싸주자 정상적으로 동작했습니다.
위 내용처럼 리액트 테스트 환경에서는 모든 상태 변경이 act 내부에서 실행되어야 한다는 걸 알았습니다.
코드 품질
이 테스트에 대한 이해가 맞는지 의문이 들어서 다시 리팩토링 해보고 싶습니다.
학습 효과 분석
과제 피드백
과제를 통해 테스트 코드에 대한 기본적인 이해가 많이 생겼습니다.
사전 스터디 때는 테스트 코드의 이론적인 부분만 접했기 때문에 깊게 다루지 못했지만, 이번 과제를 통해 직접 작성하고 실행해보면서 테스트가 실제로 어떻게 동작하는지를 명확하게 경험할 수 있어 좋았습니다.
리뷰 받고 싶은 내용
이 테코를 진행할 때 만약 휴일이 추가될 경우 테스트 코드 에러가 날텐데 그런 경우를 대비해서 작성할 수 있는 방법이 있을까요?