느릿늘있

[ Vitest ] 테스트 코드 개선 경험 기록 본문

삽질로그

[ Vitest ] 테스트 코드 개선 경험 기록

JHKim93 2024. 11. 4. 01:18

1. 문제 코드

  it('검색어에 맞는 이벤트만 필터링해야 한다', async () => {
    const { result: searchResult } = renderHook(() => useSearch(events, new Date(), 'month'));
	const { filteredEvents, setSearchTerm } = result.current;
    
    act(() => {
      searchResult.current.setSearchTerm('헬스장');
    });

    filteredEvents.forEach((event: Event) => {
      const searchTargets: EventKeys[] = ['title', 'description', 'location'];
      const isFiltered = searchTargets.some((target: EventKeys) => event[target] === '헬스장');
      expect(isFiltered).toBeTruthy();
    });
  });
  • 문제점 1 : result의 current를 구조분해할당 하면서 act 이후의 filteredEvents가 변경되지 않은 값으로 테스트하고 있음
  • 문제점 2 : expect를 forEach문 안에서 실행함으로써 테스트 동작이 많아지고 예측이 어려워지고 있음

2. 해결 코드

  it('검색어에 맞는 이벤트만 필터링해야 한다', async () => {
    const { result: searchResult } = renderHook(() => useSearch(events, new Date(), 'month'));
	const { setSearchTerm } = result.current;
    
    act(() => {
      searchResult.current.setSearchTerm('헬스장');
    });
    
    const { filteredEvents } = result.current; // act 이후 바뀐 current에서 조회
    
    const result = filteredEvents.every((event: Event) => {
      const searchTargets: EventKeys[] = ['title', 'description', 'location'];
      const isFiltered = searchTargets.some((target: EventKeys) => event[target] === '헬스장');
      return isFiltered;
    });

    expect(result).toBeTruthy(); // Array.every로 전체가 참인지 한번만 체크
  });
  • 해결 1 : act 이후 변경된 current로 이후 검증 진행
  • 해결 2 : Array.every 매서드로 테스트 결과 한 번만 체크