inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

4.6. RTL 비동기 유틸 함수를 통한 노출 테스트 작성

screen.findAllByTestId 질문

해결된 질문

331

foreverchoi0706

작성한 질문수 2

1

it('보여줄 상품 리스트가 더 있는 경우 show more 버튼이 노출되며, 버튼을 누르면 상품 리스트를 더 가져온다.', async () => {
  const { user } = await render(<ProductList limit={PRODUCT_PAGE_LIMIT} />);
  await screen.findAllByTestId('product-card');
  const showMoreButton = screen.getByRole('button', {
    name: 'Show more',
  });
  expect(showMoreButton).toBeInTheDocument();
  await user.click(showMoreButton);

  expect(await screen.findAllByTestId('product-card')).toHaveLength(
    PRODUCT_PAGE_LIMIT * 2,
  );
});

여기서 render 이후에 await screen.findAllByTestId('product-card'); 를 하는 이유가 있나요? 저걸 해주지 않으면 버튼이나 상품 아이템을 그리지 못하는 건 아는데... 그려지는 이유를 모르겠어서요 await로 찾을때까지 대기하는 걸로 이해하면 될까요?

1. 그렇다면 render 호출 이후 요소를 찾지 않아도 되는 경우에도 await screen.findAllByTestId('product-card');를 해주어야 하는걸까요?

2. 아래와 같이 하는거랑 차이가 있나요?

it('보여줄 상품 리스트가 더 있는 경우 show more 버튼이 노출되며, 버튼을 누르면 상품 리스트를 더 가져온다.', async () => {
  const { user } = await render(<ProductList limit={PRODUCT_PAGE_LIMIT} />);
  const showMoreButton = await screen.findByRole('button', {
    name: 'Show more',
  });
  expect(showMoreButton).toBeInTheDocument();
  await user.click(showMoreButton);

  expect(await screen.findAllByTestId('product-card')).toHaveLength(
    PRODUCT_PAGE_LIMIT * 2,
  );
});

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

답변 1

0

코드 조커, 오프

안녕하세요. 질문 주신 부분 차례대로 답변 드리겠습니다!

여기서 render 이후에 await screen.findAllByTestId('product-card'); 를 하는 이유가 있나요? 저걸 해주지 않으면 버튼이나 상품 아이템을 그리지 못하는 건 아는데... 그려지는 이유를 모르겠어서요 await로 찾을때까지 대기하는 걸로 이해하면 될까요?

우선 말씀해주신 것처럼 렌더링이 완료되었다는 것을 확인하는 즉, 대기하는 코드가 맞습니다.

상품 리스트를 사용하는 부분을 우선적으로 살펴보면 좋을 것 같은데요. (코드) ProductList에서 호출하는 API가 마무리 될 때까지 Suspense에 감싸져 있기 때문에 듣고계신 4.6장에서 설명하는 내용처럼 비동기 API가 마무리 될 때까지 대기가 필요해 findBy- API를 사용합니다.

1. 그렇다면 render 호출 이후 요소를 찾지 않아도 되는 경우에도 await screen.findAllByTestId('product-card');를 해주어야 하는걸까요?

상품 리스트가 완전히 로드되지 않았을 때 상태, 예를 들어 로딩이 완벽하게 되지 않은 상태에서 skeleton 화면이 나타난다 등을 검증할때는 굳이 상품 리스트가 로딩되는 것을 기다릴 필요가 없기 때문에 말씀해주신대로 굳이 기다리지 않아도 괜찮습니다.

2. 아래와 같이 하는거랑 차이가 있나요?

이 코드에서는 상품 리스트의 렌더링 완료 여부가 아닌, Show more 버튼이 노출될 때까지 대기하게 될건데요. 이런 경우 API 호출을 완료한 뒤 상품리스트의 렌더링이 완료되었음에도 불구하고 Show more 버튼이 노출되지 않는 케이스도 있을 수 있습니다. 그렇기 때문에 상품 리스트가 제대로 렌더링이 안된건지 렌더링이 완료되었음에도 Show more 버튼이 렌더링 안되는 것인지 추가적으로 파악하는 과정이 발생하여 모호하게 느껴질 수 있는 부분이 존재할 수 있습니다. 각 단계 흐름의 가독성을 좋게 하기 위해 나눠 작성했다고 이해해주시면 좋을 것 같습니다.

 

혹시 이해가 안되는 부분 있다면 편하게 댓글 남겨주세요! 감사합니다~ 새해 복 많이 받으세요!

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