Библиотека тестирования реакции, почему toBeInTheDocument() не является функцией

Вот мой код для всплывающей подсказки, которая переключает свойство CSS display: block при наведении мыши и при отсутствии мыши display: none.

 it('should show and hide the message using onMouseOver and onMouseOut events respectively', () => {
    const { queryByTestId, queryByText } = render(
      <Tooltip id = "test" message = "test" />,
    )
    fireEvent.mouseOver(queryByTestId('tooltip'))
    expect(queryByText('test')).toBeInTheDocument()
    fireEvent.mouseOut(queryByTestId('tooltip'))
    expect(queryByText('test')).not.toBeInTheDocument()
    cleanup()
  })

Я продолжаю получать сообщение об ошибке TypeError: expect(...).toBeInTheDocument не является функцией

У кого-нибудь есть идеи, почему это происходит? Мои другие тесты для рендеринга и моментального снимка компонента работают, как и ожидалось. Как и queryByText и queryByTestId.

Я опубликовал подробный ответ для тех, кто борется с использованием ts-jest без babel-jest, и ничего не работает. Надеюсь поможет: stackoverflow.com/a/66708479/2170368

Greg Wozniak 19.03.2021 13:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
82
1
77 456
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

toBeInTheDocument не является частью RTL. Вам нужно установить шутка, чтобы включить его.

А затем импортируйте его в свои тестовые файлы: import '@testing-library/jest-dom'

как вы его импортируете, вы могли бы дать полный ответ здесь...

Eugen Sunic 31.01.2020 00:40

@EugenSunic Просто используйте import '@testing-library/jest-dom'

Cog 24.07.2020 02:01

@Cog, это всегда так?

Welp 04.03.2021 12:09

В приложении Create React import '@testing-library/jest-dom' будет в setupTests.ts. При обновлении более старого приложения Create React вам необходимо создать setupTests.ts. См. github.com/facebook/create-react-app/blob/master/packages/…

André Ricardo 27.04.2021 12:05

Как упомянул Джорджио, вам нужно установить jest-dom. Вот что сработало для меня:

(Я использовал машинописный текст)

npm i --save-dev @testing-library/jest-dom

Затем добавьте импорт в свой setupTests.ts.

import '@testing-library/jest-dom/extend-expect';

Затем в вашем jest.config.js вы можете загрузить его через:

"setupFilesAfterEnv": [
    "<rootDir>/src/setuptests.ts"
  ]


ESLint жалуется на синтаксис jest.config.js?

Kevin Burton 04.07.2020 08:53

Я думаю, вам нужно вложить его внутрь module.exports = { ... }

skube 27.07.2020 19:43

Jest отлично работал с вышеуказанным решением, но VSCode все еще жаловался (Свойство toBeInTheDocument не существует для типа...), поэтому мне также пришлось установить типы: yarn add @types/testing-library__jest-dom --dev

Fab313 03.02.2021 12:14

Вместо того, чтобы делать:

    expect(queryByText('test')).toBeInTheDocument()

вы можете найти и проверить, что он находится в документе всего одной строкой, используя

    let element = getByText('test');

Тест завершится ошибкой, если элемент не будет найден с помощью вызова getBy.

Когда вы это сделаете npm i @testing-library/react, убедитесь, что в нем есть файл setupTests.js со следующим оператором

import '@testing-library/jest-dom/extend-expect';

Некоторые из принятых ответов были в основном правильными, но некоторые могут быть немного устаревшими: Некоторые ссылки, которые хороши на данный момент:

Вот все, что вам нужно:

  1. в <rootDir> проекта (где находятся package.json и jest.config.js) убедитесь, что у вас есть файл с именем jest.config.js, чтобы Jest мог автоматически выбрать его для настройки. Файл написан на JS, но структурирован аналогично package.json.
  2. Убедитесь, что вы ввели следующее:
  module.exports = {
    testPathIgnorePatterns: ['<rootDir>/node_modules', '<rootDir>/dist'], // might want?
    moduleNameMapper: {
      '@components(.*)': '<rootDir>/src/components$1' // might want?
    },
    moduleDirectories: ['<rootDir>/node_modules', '<rootDir>/src'],
    setupFilesAfterEnv: ['<rootDir>/src/jest-setup.ts'] // this is the KEY
    // note it should be in the top level of the exported object.
  };
  1. Также обратите внимание, что если вы используете машинописный текст, вам необходимо убедиться, что ваш файл jest-setup.ts скомпилирован (поэтому добавьте его в src или в список элементов для компиляции в вашем tsconfig.json.

  2. В верхней части файла jest-setup.ts/js (или как вы хотите назвать эту точку входа) файла: добавьте import '@testing-library/jest-dom';.

  3. Вы также можете убедиться, что он действительно работает, поэтому поставьте console.info('hello, world!');. У вас также есть возможность добавить любые глобальные функции, которые вы хотели бы иметь в шутку, например (global.fetch = jest.fn()).

  4. Теперь вам действительно нужно установить @testing-library/jest-dom: npm i -D @testing-library/jest-dom в консоли.

С этими шагами вы должны быть готовы использовать jest-dom:

Без ТС: вам еще нужно:

  1. npm i -D @testing-library/jest-dom
  2. Создание jest.config.js и добавление к нему как минимум: module.exports = { setupFilesAfterEnv: ['<rootDir>/[path-to-file]/jest-setup.js'] }.
  3. Создание [path-to-file]/jest-setup.js и добавление к нему: import '@testing-library/jest-dom';.

Файл jest-setup также является отличным местом для настройки тестов, таких как создание специальной функции renderWithProvider( или настройка глобальных оконных функций.

добавление его под /src/ при использовании машинописного текста является очень важным советом. Я переместил свой файл setupTests.ts из-за некоторых рефакторингов, которые тогда сломали все тесты

EimerReis 11.02.2022 16:49

Попробовав все советы в этом посте, и они все еще не работают для меня, я хотел бы предложить альтернативное решение:

Установите шутку-дом:

npm i --save-dev @testing-library/jest-dom

Затем создайте файл setupTests.js в каталог src (этот бит важен! Он был у меня в корневом каталоге, и это сработало с нет...). Сюда поместите:

import '@testing-library/jest-dom'

(или require(...), если вам так больше нравится).

Это сработало для меня :)

Мне было трудно решить эту проблему, поэтому я считаю важным отметить следующее, если вы используете CREATE REACT APP для своего проекта:

  1. Вам НЕ нужен файл jest.config.js, чтобы решить эту проблему, поэтому, если он у вас есть, вы можете удалить его.
  2. НЕ НУЖНО ничего менять в package.json.
  3. Вы ДОЛЖНЫ назвать свой установочный файл шутки setupTests.js и поместить его в папку src. НЕ БУДЕТ работать, если ваш установочный файл называется jest.setup.js или jest-setup.js.
  1. установить необходимые пакеты

    npm install --save-dev @testing-library/jest-dom eslint-plugin-jest-dom

  2. создайте jest-setup.js в корневой папке вашего проекта и добавьте

    импортировать '@testing-library/jest-dom'

  3. в jest.config.js

    setupFilesAfterEnv: ['/jest-setup.js']

  4. только TypeScript, добавьте следующее в файл tsconfig.json. Кроме того, изменить расширение .js на .ts.

    "включить": ["./jest-setup.ts"]

toBeInTheDocument() и многие подобные функции не являются частью React-testing-library. Требует установки дополнительного пакета.

Спасибо! Но зачем кому-то использовать машинописный текст?

Victor Pudeyev 09.02.2022 01:04

Г-н Пудеев, при всем уважении, я считаю, что JavaScript предназначен для того, чтобы работать так, как он работает в настоящее время, а TypeScript разработан, чтобы избежать причудливых граней JavaScript. Мы не знаем JavaScript; мы притворяемся, что знаем --- Getify. Вы должны иметь глубокие знания JavaScript, чтобы предотвратить их, поэтому я лично использую TypeScript, чтобы ходить по зоне безопасности.

Esmaeil MIRZAEE 11.02.2022 08:21

Ни один из ответов не сработал для меня, потому что я допустил глупую ошибку, набрав toBeInDocument() вместо toBeInTheDocument(). Может быть, кто-то еще сделал ту же ошибку :)

Другие вопросы по теме