인프런 커뮤니티 질문&답변

foreverchoi0706님의 프로필 이미지
foreverchoi0706

작성한 질문수

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

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

screen.findAllByTestId 질문

해결된 질문

작성

·

271

·

수정됨

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,
  );
});

답변 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 버튼이 렌더링 안되는 것인지 추가적으로 파악하는 과정이 발생하여 모호하게 느껴질 수 있는 부분이 존재할 수 있습니다. 각 단계 흐름의 가독성을 좋게 하기 위해 나눠 작성했다고 이해해주시면 좋을 것 같습니다.

 

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

foreverchoi0706님의 프로필 이미지
foreverchoi0706

작성한 질문수

질문하기