inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

3.4. 타이머 테스트

3.4. 타이머 테스트의 마지막 테스트 질문입니다.

해결된 질문

378

Kate

작성한 질문수 3

1

  it('연이어 호출해도 마지막 호출 기준으로 지정된 타이머 시간이 지난 경우에만 함수가 호출된다.', () => {
    const spy = vi.fn();

    const debouncedFn = debounce(spy, 300);

    // 최초 호출
    debouncedFn();

    // 최초 호출 후 0.2초 후 호출
    vi.advanceTimersByTime(200);
    debouncedFn();

    // 두번째 호출 후 0.1초 후 호출
    vi.advanceTimersByTime(100);
    debouncedFn();

    // 세번째 호출 후 0.2초 후 호출
    vi.advanceTimersByTime(200);
    debouncedFn(); // 👈 4번째 호출

    // 네번째 호출 후 0.3초 후 호출
    // 최초 호출 후에 함수 호출 간격이 0.3초 이상 -> 다섯번째 호출이 유일
    vi.advanceTimersByTime(300);
    debouncedFn(); // 👈 5번째 호출

    // 다섯번을 호출했지만 실제 spy함수는 단 한 번만 호출
    expect(spy).toHaveBeenCalledTimes(1);
  });

 

안녕하세요. 새해 복 많이 받으세요 :)

다름이 아니라 위 코드에서 4번째 호출 후 바로 뒤, vi.advanceTimersByTime(300);로 인해 0.3초가 흘렀고 이로 인해 expect(spy).toHaveBeenCalledTimes(1); 이 맞다고 나온 것이 아닌지 궁금해서 질문드립니다.

강의에서는 4번째 호출이 아닌 5번째 호출로 인해 호출된다고 하셨는데(최초 호출 후에 함수 호출 간격이 0.3초 이상인 경우는 다섯번째 호출이 유일하다고 하신 것 같아요) 5번째 호출 후에는 0.3초가 흘렀다는 가정 (vi.advanceTimersByTime(300);)이 없고 제가 혼자 테스트 해보며 5번째 호출 후에 vi.advanceTimersByTime(300);를 넣어 0.3초가 흘렀다고 가정을 하니 호출이 2번 되었다고 떠서요.

제가 debounce를 헷갈려 했는데 제가 아직 잘 이해하지 못한 부분이 있는 건지 아니면 실제로 잘못 설명된 부분이 있는 건지 모르겠어서 질문 드립니다.

 

감사합니다.

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

답변 1

1

코드 조커, 오프

안녕하세요 Kate님! 어제 이사를 해서 질문 답변이 늦은 점 양해 부탁드립니다. 😇

우선, 말씀해주신 부분이 맞습니다. 테스트를 잘못 작성했던 것 같네요. 해당 부분은 수정해서 업로드 해두도록 하겠습니다!

실패하는 시나리오를 아래 작성해봤는데요. 이 코드를 보면 좀 더 이해하기 쉬우실 것 같습니다.

it('연이어 호출해도 마지막 호출 기준으로 지정된 타이머 시간이 지난 경우에만 함수가 호출된다.', () => {
    const spy = vi.fn();

    const debouncedFn = debounce(spy, 300);

    debouncedFn();

    expect(spy).toHaveBeenCalledTimes(1); // 검증 시점 함수는 아직 대기 상태! 실패한다
});

따라서, 해당 테스트의 단언 내용은 네 번째 함수의 결과로 검증되는 것이 맞으며 마지막 함수 호출은 현재로써는 무의미한 상태라고 볼 수 있을 것 같습니다.

추가로 궁금하신 점 있으시면 편하게 질문 남겨주시면 감사하겠습니다.

새해 복 많이 받으세요!

1

코드 조커, 오프

https://github.com/practical-fe-testing/test-example-shopping-mall/commit/fef895ff98c93b743206f8cb7ebac5d0c61883cb

이 커밋에서 수정되었습니다. 감사합니다!

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