Вот мой код для всплывающей подсказки, которая переключает свойство 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.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


toBeInTheDocument не является частью RTL. Вам нужно установить шутка, чтобы включить его.
А затем импортируйте его в свои тестовые файлы:
import '@testing-library/jest-dom'
как вы его импортируете, вы могли бы дать полный ответ здесь...
@EugenSunic Просто используйте import '@testing-library/jest-dom'
@Cog, это всегда так?
В приложении Create React import '@testing-library/jest-dom' будет в setupTests.ts. При обновлении более старого приложения Create React вам необходимо создать setupTests.ts. См. github.com/facebook/create-react-app/blob/master/packages/…
Как упомянул Джорджио, вам нужно установить 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?
Я думаю, вам нужно вложить его внутрь module.exports = { ... }
Jest отлично работал с вышеуказанным решением, но VSCode все еще жаловался (Свойство toBeInTheDocument не существует для типа...), поэтому мне также пришлось установить типы: yarn add @types/testing-library__jest-dom --dev
Вместо того, чтобы делать:
expect(queryByText('test')).toBeInTheDocument()
вы можете найти и проверить, что он находится в документе всего одной строкой, используя
let element = getByText('test');
Тест завершится ошибкой, если элемент не будет найден с помощью вызова getBy.
Когда вы это сделаете npm i @testing-library/react, убедитесь, что в нем есть файл setupTests.js со следующим оператором
import '@testing-library/jest-dom/extend-expect';
Некоторые из принятых ответов были в основном правильными, но некоторые могут быть немного устаревшими: Некоторые ссылки, которые хороши на данный момент:
Вот все, что вам нужно:
<rootDir> проекта (где находятся package.json и jest.config.js) убедитесь, что у вас есть файл с именем jest.config.js, чтобы Jest мог автоматически выбрать его для настройки. Файл написан на JS, но структурирован аналогично package.json. 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.
};
Также обратите внимание, что если вы используете машинописный текст, вам необходимо убедиться, что ваш файл jest-setup.ts скомпилирован (поэтому добавьте его в src или в список элементов для компиляции в вашем tsconfig.json.
В верхней части файла jest-setup.ts/js (или как вы хотите назвать эту точку входа) файла: добавьте import '@testing-library/jest-dom';.
Вы также можете убедиться, что он действительно работает, поэтому поставьте console.info('hello, world!');. У вас также есть возможность добавить любые глобальные функции, которые вы хотели бы иметь в шутку, например (global.fetch = jest.fn()).
Теперь вам действительно нужно установить @testing-library/jest-dom: npm i -D @testing-library/jest-dom в консоли.
С этими шагами вы должны быть готовы использовать jest-dom:
Без ТС: вам еще нужно:
npm i -D @testing-library/jest-domjest.config.js и добавление к нему как минимум: module.exports = { setupFilesAfterEnv: ['<rootDir>/[path-to-file]/jest-setup.js'] }.[path-to-file]/jest-setup.js и добавление к нему: import '@testing-library/jest-dom';.Файл jest-setup также является отличным местом для настройки тестов, таких как создание специальной функции renderWithProvider( или настройка глобальных оконных функций.
добавление его под /src/ при использовании машинописного текста является очень важным советом. Я переместил свой файл setupTests.ts из-за некоторых рефакторингов, которые тогда сломали все тесты
Попробовав все советы в этом посте, и они все еще не работают для меня, я хотел бы предложить альтернативное решение:
Установите шутку-дом:
npm i --save-dev @testing-library/jest-dom
Затем создайте файл setupTests.js в каталог src (этот бит важен! Он был у меня в корневом каталоге, и это сработало с нет...). Сюда поместите:
import '@testing-library/jest-dom'
(или require(...), если вам так больше нравится).
Это сработало для меня :)
Мне было трудно решить эту проблему, поэтому я считаю важным отметить следующее, если вы используете CREATE REACT APP для своего проекта:
jest.config.js, чтобы решить эту проблему, поэтому, если он у вас есть, вы можете удалить его.package.json.setupTests.js и поместить его в папку src. НЕ БУДЕТ работать, если ваш установочный файл называется jest.setup.js или jest-setup.js.установить необходимые пакеты
npm install --save-dev @testing-library/jest-dom eslint-plugin-jest-dom
создайте jest-setup.js в корневой папке вашего проекта и добавьте
импортировать '@testing-library/jest-dom'
в jest.config.js
setupFilesAfterEnv: ['/jest-setup.js']
только TypeScript, добавьте следующее в файл tsconfig.json. Кроме того, изменить расширение .js на .ts.
"включить": ["./jest-setup.ts"]
toBeInTheDocument() и многие подобные функции не являются частью React-testing-library. Требует установки дополнительного пакета.
Спасибо! Но зачем кому-то использовать машинописный текст?
Г-н Пудеев, при всем уважении, я считаю, что JavaScript предназначен для того, чтобы работать так, как он работает в настоящее время, а TypeScript разработан, чтобы избежать причудливых граней JavaScript. Мы не знаем JavaScript; мы притворяемся, что знаем --- Getify. Вы должны иметь глубокие знания JavaScript, чтобы предотвратить их, поэтому я лично использую TypeScript, чтобы ходить по зоне безопасности.
Ни один из ответов не сработал для меня, потому что я допустил глупую ошибку, набрав toBeInDocument() вместо toBeInTheDocument(). Может быть, кто-то еще сделал ту же ошибку :)
Я опубликовал подробный ответ для тех, кто борется с использованием
ts-jestбезbabel-jest, и ничего не работает. Надеюсь поможет: stackoverflow.com/a/66708479/2170368