Как вы проверяете отсутствие элемента с помощью библиотеки jest и react-testing-library?


95

У меня есть библиотека компонентов, в которой я пишу модульные тесты для использования Jest и react-testing-library. На основе определенных свойств или событий я хочу убедиться, что определенные элементы не отображаются.

getByText, getByTestIdи т. д. выдают ошибку, react-testing-libraryесли элемент не найден, что приводит к сбою теста до срабатывания expectфункции.

Как вы тестируете что-то не существующее в шутке с помощью библиотеки react-testing-library?

Ответы:


200

Из DOM Testing-library Docs - Appearance and Disappearance

Утверждающие элементы отсутствуют

Стандартные getByметоды бросают ошибку , когда они не могут найти элемент, так что если вы хотите , чтобы сделать утверждение , что элемент не присутствует в DOM, вы можете использовать queryByAPI , вместо того, чтобы :

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

Версия queryAllAPI возвращает массив совпадающих узлов. Длина массива может быть полезна для утверждений после добавления или удаления элементов из 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 ();
Something

3
Я считаю, что ссылка выше была предназначена для указания на документы библиотеки тестирования реакции
pbre

2
Новый сайт документации был опубликован несколько дней назад. Я должен был использовать более постоянную ссылку. Спасибо за обновление @pbre!
kentcdodds

1
Еще один удобный ресурс: testing-library.com/docs/react-testing-library/cheatsheet
SomethingOn

6
и queryByTextдля тех, кто хочет эквивалент getByTextэтого, это нуль-безопасно
S ..

22

Используйте queryBy/ queryAllBy.

Как вы говорите, getBy*и getAllBy*выкидывают ошибку, если ничего не найдено.

Однако, эквивалентные методы queryBy*и queryAllBy*вместо того, чтобы вернуть nullили []:

queryBy

queryBy*запросы возвращают первый совпадающий узел для запроса и возвращают, nullесли ни один элемент не соответствует. Это полезно для утверждения элемента, которого нет. Это срабатывает, если найдено более одного совпадения (вместо этого используйте queryAllBy).

queryAllBy*Запросы queryAllBy возвращают массив всех совпадающих узлов для запроса и возвращают пустой массив ( []), если ни один элемент не соответствует.

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

Итак, для конкретных двух, которые вы упомянули, вы бы вместо этого использовали queryByTextи queryByTestId, но они работают для всех запросов, а не только для этих двух.


2
Это лучше, чем принятый ответ. Этот API новее?
RubbelDieKatz

1
Спасибо за добрые слова! Это в основном та же функциональность, что и принятый ответ , поэтому я не думаю, что это более новый API (но я могу ошибаться). Единственная реальная разница между этим ответом и принятым состоит в том, что в принятом ответе говорится, что существует только метод, который делает это ( queryByTestId), хотя на самом деле существует два полных набора методов, из которых queryByTestIdодин конкретный пример.
Сэм

Спасибо, я бы предпочел это, чем установка тестовых идентификаторов
Hylle

13

Вы должны использовать queryByTestId вместо getByTestId.

Вот пример кода, в котором я хочу проверить, не существует ли компонента с идентификатором «автомобиль».

 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", а затем проверить, является ли компонент нулевым. Имеет то преимущество, что не нужно устанавливать TestID, также должен работать со сторонними компонентами

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

Этот вид нарушает предпосылку отсутствия деталей реализации (таких как имя компонента) в тесте.
RubbelDieKatz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.