Jest/Enzyme - TypeError: div.find не является функцией

Ниже приведен небольшой тестовый файл, который я сделал для проекта React, в котором для тестирования используются как Jest, так и Enzyme. В этом тесте я просто пытаюсь найти элемент в компоненте и убедиться, что он существует (как истинное условие). Весь смысл этого теста заключался не только в том, чтобы проверить, существует ли элемент, но я решил, что начну с него. Я очень новичок в тестировании, поэтому этот синтаксис/реализация может быть сумасшедшим:

import React from 'react';
import ReactDOM from 'react-dom';

import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';

import HamburgerIcon from './HamburgerIcon';

Enzyme.configure({ adapter: new Adapter() });

test('my first test -- will add better text here later', () => {
  const div = document.createElement('div');
  ReactDOM.render(<HamburgerIcon />, div);

  expect(div.find('.closed').exists()).toBeTruthy();

  ReactDOM.unmountComponentAtNode(div);
});

Выполнение этого приводит к этой ошибке:

TypeError: div.find is not a function

Первоначально я построил этот тест, увидев этот ответ на переполнение стека.

Я не уверен, как устранить эту проблему, но я предполагаю, что, возможно, я неправильно «смонтировал» компонент в этом тесте? В той же ветке переполнения стека из предыдущей ссылки, этот ответ показывает, как вы будете монтировать компонент, но в другом комментарии к этому ответу говорится, что для этого необходимо установить другой пакет.

Я как бы подумал, что использование переменной div в качестве контейнера для поиска с помощью find будет работать, но я ошибаюсь, думая так?

.find - это метод jquery, а не родной для javascript
Isaac Vidrine 30.05.2019 23:00

Вам нужно следовать правильному руководству, а не прыгать с ответов stackoverflow. Вы находитесь в неправильном направлении. Вам не хватает монтирования или поверхностного рендеринга в вашем коде и на котором вы запускаете .find ReactDOM не тестовый рендерер, в вашем случае энзим

Rikin 30.05.2019 23:02
.find находится в Enzyme API -- Я думаю, что импорт фермента будет включать .find, но, может быть, я ошибаюсь?
rpivovar 30.05.2019 23:02

Посмотрев на другой пост SO, они используют .find для компонента реакции, а не для собственного объекта элемента javascript. Так что вам понадобится expect(Component1.find(<Component2 />).exists()).toBeTruthy();

Isaac Vidrine 30.05.2019 23:03

@Rikin спасибо - я посмотрю на монтаж и на то, как это работает.

rpivovar 30.05.2019 23:04
Поведение ключевого слова "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) для оценки ваших знаний,...
0
5
2 679
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вот пример кода для вас, возможно, не на 100% то, что вам нужно, но вы должны начать. Я также включил console.info, чтобы вы знали, что будет отображаться.

Чтобы немного объяснить, что происходит, в вашем тестовом примере вы вызываете метод shallow и передаете ему свой компонент React для рендеринга. Тестовые случаи запускаются в виртуальном браузере/рендерере, а не в реальном браузере (если вы не настроите его таким образом).

import React from 'react';
import ReactDOM from 'react-dom';

import Enzyme, { shallow } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';

import HamburgerIcon from './HamburgerIcon';

Enzyme.configure({ adapter: new Adapter() });

test('my first test -- will add better text here later', () => {
  const wrapper = shallow(<HamburgerIcon />);
  console.info(wrapper);
  expect(wrapper.find('.closed').exists()).toBeTruthy();
});

Спасибо, это проходит! Я посмотрю, как это работает.

rpivovar 30.05.2019 23:43

Я также видел это ранее, когда искал информацию - не прочитал ее полностью, но решил поделиться ею - kentcdodds.com/blog/why-i-never-use-shallow-rendering - не уверен, что у вас есть какие-либо мысли по этому поводу! В любом случае, я буду изучать ферменты shallow и mount больше.

rpivovar 30.05.2019 23:45

Зависит от необходимости, я бы сказал. Но загляните в его библиотеку react-testing-library проще ужиться и играть с ней. В этом случае вам не нужен фермент.

Rikin 30.05.2019 23:48

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