jest 및 react-testing-library를 사용하여 요소의 존재 여부를 어떻게 테스트합니까?


95

Jest 및 react-testing-library를 사용하기위한 단위 테스트를 작성중인 구성 요소 라이브러리가 있습니다. 특정 소품이나 이벤트를 기반으로 특정 요소가 렌더링되지 않는지 확인하고 싶습니다.

getByText, getByTestIdreact-testing-library은 요소가 발견되지 않으면 오류 expect가 발생 하여 함수가 실행 되기 전에 테스트가 실패합니다 .

react-testing-library를 사용하여 jest에 존재하지 않는 것을 어떻게 테스트합니까?

답변:


200

에서 DOM 테스트 라이브러리 문서 도구 - 외관 및 실종

어설 션 요소가 없습니다.

표준 getBy메서드는 요소를 찾을 수 없을 때 오류를 발생시킵니다. 따라서 요소가 DOM에 존재 하지 않는다는 주장을하려면 queryBy대신 API를 사용할 수 있습니다 .

const submitButton = screen.queryByText('submit')
expect(submitButton).toBeNull() // it doesn't exist

queryAll의 API 버전이 일치하는 노드의 배열을 반환합니다. 배열의 길이는 요소가 DOM에서 추가되거나 제거 된 후 어설 션에 유용 할 수 있습니다.

const submitButtons = screen.queryAllByText('submit')
expect(submitButtons).toHaveLength(2) // expect 2 elements

not.toBeInTheDocument

jest-dom유틸리티 라이브러리가 제공하는 .toBeInTheDocument()요소가 문서 또는하지의 몸에 있음을 주장하는 데 사용할 수있는 정규 표현을. 이것은 쿼리 결과를 주장하는 것보다 더 의미가있을 수 있습니다 null.

import '@testing-library/jest-dom/extend-expect'
// use `queryBy` to avoid throwing an error with `getBy`
const submitButton = screen.queryByText('submit')
expect(submitButton).not.toBeInTheDocument()

4
내 나쁜 kentcdodds, 감사합니다. 나는 사용 getByTestId했고 같은 오류가 발생했습니다. 그리고 FAQ를 확인하지 않았습니다. 죄송합니다. 훌륭한 도서관! `.toBeNull ();을 포함하도록 대답을 수정할 수 있습니까?
SomethingOn

3
나는 위의 링크가 react-testing-library 문서
pbre

2
새 문서 사이트는 며칠 전에 게시되었습니다. 더 영구적 인 링크를 사용해야했습니다. @pbre 업데이트 주셔서 감사합니다!
kentcdodds


6
그리고 queryByText동등한 것을 원하는 사람들을 위해 getByTextnull safe
S ..

22

사용 queryBy/ queryAllBy.

당신이 말하는 것처럼, getBy*그리고getAllBy* 아무 것도 발견되지 않으면 오류가 발생.

그러나 동등한 방법 queryBy*queryAllBy*대신 반환 null또는 []:

queryBy

queryBy*쿼리는 쿼리에 대해 첫 번째 일치하는 노드를 반환하고 일치하는 null요소가 없으면 반환 합니다. 이것은 존재하지 않는 요소를 주장하는 데 유용합니다. 둘 이상의 일치 항목이 발견되면 throw됩니다 (대신 queryAllBy 사용).

queryAllBy queryAllBy* 쿼리는 쿼리에 대해 일치하는 모든 노드의 배열을 반환하고 일치하는 []요소가 없으면 빈 배열 ( )을 반환합니다 .

https://testing-library.com/docs/dom-testing-library/api-queries#queryby

그래서 특정 당신이 언급 한 두 가지를 위해 대신 사용하는 거라고 queryByText하고 queryByTestId있지만, 모든 쿼리에 대해 이러한 작업뿐 아니라 그 두.


2
이것은 받아 들여진 대답보다 훨씬 낫습니다. 이 API가 더 최신인가요?
RubbelDieKatz

1
친절한 말씀 감사합니다! 이것은 기본적으로 허용되는 답변 과 동일한 기능 이므로 최신 API라고 생각하지 않습니다 (하지만 틀릴 수 있습니다). 이 답변과 허용되는 답변의 유일한 차이점은 허용되는 답변은 queryByTestId실제로 두 가지 전체 방법 세트가있을 때 ( ) 를 수행하는 방법 만 있다는 것 queryByTestId입니다.
Sam

감사합니다. 테스트 ID를 설정하는 것보다 더 선호합니다
Hylle

13

getByTestId 대신 queryByTestId를 사용해야합니다.

여기에 "car"ID가있는 구성 요소가 존재하지 않는지 테스트하려는 코드 예제가 있습니다.

 describe('And there is no car', () => {
  it('Should not display car mark', () => {
    const props = {
      ...defaultProps,
      base: null,
    }
    const { queryByTestId } = render(
      <IntlProvider locale="fr" messages={fr}>
        <CarContainer{...props} />
      </IntlProvider>,
    );
    expect(queryByTestId(/car/)).toBeNull();
  });
});

4

getBy *는 요소를 찾을 수 없을 때 오류를 발생 시키므로이를 확인할 수 있습니다.

expect(() => getByText('your text')).toThrow('Unable to find an element');

0

react-native-testing-library "getAllByType"을 사용한 다음 구성 요소가 null인지 확인할 수 있습니다. TestID를 설정할 필요가 없다는 장점이 있으며 타사 구성 요소에서도 작동해야합니다.

 it('should contain Customer component', () => {
    const component = render(<Details/>);
    const customerComponent = component.getAllByType(Customer);
    expect(customerComponent).not.toBeNull();
  });

이러한 유형은 테스트에서 구현 세부 정보 (예 : 구성 요소 이름)가 없다는 전제를 위반합니다.
RubbelDieKatz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.