Enzyme ожидает, что адаптер будет настроен

Я создал новое приложение React с помощью create-react-app и хотел написать модульный тест для компонента с именем «MessageBox», который я создал в приложении. Это модульный тест, который я написал:

import MessageBox from "../MessageBox";
import { shallow } from 'enzyme';
import React from 'react';

test('message box', () => {
   const app = {setState: jest.fn()};
   const wrapper = shallow(<MessageBox app = {app}/>);
   wrapper.find('button').at(0).simulate('click');
   expect(app.setState).toHaveBeenLastCalledWith({modalIsOpen: false});
});

Я также добавил файл в папку src с именем setupTests.js с содержимым:

import * as enzyme from 'enzyme';
import * as Adapter from 'enzyme-adapter-react-16';

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

Я пробежал его:

npm test

и я получил ошибку:

Enzyme Internal Error: Enzyme expects an adapter to be configured, but found none. To configure an adapter, you should call Enzyme.configure({ > adapter: new Adapter() })

Вы знаете, что может решить эту проблему?

Текущее сообщение об ошибке на дату этого комментария также имеет URL-адрес документации. Посещение этого URL-адреса в основном объясняет, что делать.

Code-Apprentice 16.05.2018 05:48

@CrazySynhax, примите еще один ответ от '@Mikel', потому что он делает конфигурацию доступной, и ваши тесты будут выглядеть более понятными. Такая явная конфигурация в каждом тесте слишком многословна.

Alexandr 22.06.2020 14:00
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
70
2
38 628
18
Перейти к ответу Данный вопрос помечен как решенный

Ответы 18

Добавьте import React from 'react'; в начало файла.

Вы используете JSX-синтаксис <MessageBox app = {app}/>, который транспилес превращается в React.createComponent(...). Для того, чтобы это работало, переменная React должна быть определена в области действия файла.

Спасибо. Но это создало другую проблему. Я отредактировал свой вопрос.

CrazySynthax 07.05.2018 23:34

Файл setupTests необходимо импортировать в тестовый файл:

import MessageBox from "../MessageBox";
import { shallow } from 'enzyme';
import React from 'react';
import "../setupTests"

test('message box', ()=> {
     ...
})

это то, что исправило это для меня.

Jim41Mavs 03.11.2020 23:51

Это было единственное, что у меня работало, но я заметил, что это проблема только в расширении Jest Runner для VS Code, поэтому я нашел для него несколько конфигураций. См. мой пост.

Lenny Laughter 23.02.2021 21:13
Ответ принят как подходящий

Добавьте его в свой файл тестового случая.

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

configure({adapter: new Adapter()});
test('message box', ()=> {
     ...
})

Это дало мне TypeError: Adapter is not a constructor. Пришлось сменить его на import Adapter from 'enzyme-adapter-react-16';, прежде чем он заработает.

Malvineous 02.07.2018 06:19

что, если вы не хотите использовать это в каждом тесте?

MaxwellLynn 26.07.2018 11:49

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

Learner 14.01.2019 17:12

Это похоже на то, что следует ввести в Enzyme как «разумное значение по умолчанию». Весь этот конфигурационный шум утомляет.

oooyaya 07.03.2019 17:05

Спасибо! Это действительно помогло мне исправить другой тест :)

Leon Gaban 18.06.2019 20:46

@MaxwellLynn Вы можете создать файл setup.js. Проверить ссылку. github.com/airbnb/enzyme/issues/1265

GAJESH PANIGRAHI 19.06.2019 19:18

Если вы создадите setupTests.js, поместите его в каталог src и добавите конфигурацию фермента, он должен работать.

Int'l Man Of Coding Mystery 30.03.2020 16:47

Думаю, в ответе следует упомянуть, что import и configure необходимо вставить в setupTests.js.

thinkvantagedu 07.08.2020 12:53

Вам нужно использовать импорт следующим образом:

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

Таким образом: (импортировать * как адаптер из ...) возвращает сообщение «Ошибка типа: адаптер не является конструктором».

Кроме того, если вы не хотите импортировать файл setupTests.js в каждый тестовый файл, вы можете поместить его в папку package.json:

  "jest": {
     "setupTestFrameworkScriptFile": "./test/setupTests.js" }

Обновлять:

Note: setupTestFrameworkScriptFile is deprecated in favor of setupFilesAfterEnv.

https://jestjs.io/docs/en/configuration

Чтобы получить полезный ответ, эту реакцию нужно расширить. Объясните, почему это ответ на вопрос.

Jeroen Heier 23.10.2018 16:52

для людей, использующих приложение creat-response-app, вам не нужно делать запись в файле package.json. просто создайте setupTests.js в src, и он будет выбран автоматически. Также просто импортируйте адаптер, а не * как адаптер

Priyank Thakkar 22.11.2018 22:17

Вот дополнительная информация, подтверждающая комментарий Приянка: github.com/airbnb/enzyme/issues/1265 Микель приводит пример файла src / setupTests.js в другом ответе.

mojave 02.01.2019 02:23

Попробуй вот так;

import React from 'react';
import App from './containers/App';
import enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
enzyme.configure({ adapter: new Adapter() });

describe('App Screen', () => {
  let mountedAppScreen;
  let props;

  const appScreen = () => {
    if (!mountedAppScreen) {
      mountedAppScreen = enzyme.mount(
        <App {...props} />
      );
    }
    return mountedAppScreen;
  }
  it("it always renders div", () => {
    const divs = appScreen().find("div");
    expect(divs.length).toBeGreaterThanOrEqual(1);
  });
});

Используя последнюю версию библиотек, я столкнулся с той же ошибкой, о которой сообщалось в каждом ответе на этот вопрос. Ошибка: TypeError: адаптер не является конструктором.

Я сгруппировал все необходимые шаги, чтобы правильно протестировать ваш компонент ReactJS с помощью Enzyme (Я использовал Jest, но он может работать и с Mocha, в этом случае просто переключите основной тестовый пакет):

1) Библиотеки (package.json):

"dependencies": {
    "jest": "^24.6.0",
    (...)
}
"devDependencies": {
    "chai": "^4.2.0",
    "enzyme": "^3.7.0",
    "enzyme-adapter-react-16": "^1.7.0",
   (...)
}

2) ИСПЫТАТЕЛЬНАЯ УСТАНОВКА: вы можете настроить фермент в каждом тесте. Но, как мудро предположил type_master_flash, для этого можно добавить скрипт. Для этого создайте новый параметр в файле package.json на том же уровне сеансов скрипты, зависимости и т. д.:

Версия Jest 23.x (или предыдущая):

"devDependencies": { 
     (...) 
 },
"jest": {
    "setupTestFrameworkScriptFile": "./tests.setup.js"
 },

После версии Jest 24.0: Согласно Документация Jest, «setupTestFrameworkScriptFile устарел в пользу setupFilesAfterEnv».

"devDependencies": { 
     (...) 
 },
"jest": {
    "setupFilesAfterEnv": ["./tests.setup.js"]
 },

Этот файл может быть где угодно, и вы можете называть его как хотите. Просто не забудьте указать правильное расположение файла. В текущем примере я сохранил свой файл в корне моего проекта.

3) tests.setup.js: Как я обнаружил в Фермент: TypeError: адаптер не является конструктором, проблема здесь в том, что мы не можем «Импортировать '' модуль с экспортом по умолчанию». Правильный способ настройки файла:

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

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

Только это, и вы можете протестировать свои компоненты.

Ура и надеюсь, что это поможет.

Не уверен, что 2) ТЕСТ НАСТРОЙКА по-прежнему жизнеспособен. По крайней мере, если приложение React находится вне коробки. Вы получаете такие ошибки, как: These options in your package.json Jest configuration are not currently supported by Create React App: • setupTestFrameworkScriptFile

Daedalus 05.05.2019 22:18

Хорошо заметил @Daedalus. Я обновлю свой ответ до последней версии. Спасибо

Daniel Santana 06.05.2019 23:17

Как Приянк сказал, если вы используете приложение Create React, оно получит конфигурацию из src/setupTests.js.

Добавлять:

import { configure } from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'

configure({ adapter: new Adapter() })

зачем нам нужен адаптер, как и в официальных документах, также говорится об использовании адаптера, но зачем он нужен. Новичок в шутках и энзимах. Я не знаю, хороший это вопрос или нет

Learner 19.01.2019 16:24

В моем случае вместо того, чтобы называть файл конфигурации «setupTests.js», я назвал его «setUpTests.js». когда я сменил название, это сработало.

Gsp Ivan 03.02.2019 21:53

Это работает. Для проектов Typescript он должен иметь расширение .ts: src / setupTests.ts

gkri 26.11.2019 14:59

Многие ответы говорят об импорте setupTests.js в ваш тестовый файл. Или же настроить адаптер фермента в каждом тестовом файле. Что решает насущную проблему.

Но в долгосрочной перспективе, если вы добавите файл jest.config.js в корень проекта. Вы можете настроить его для запуска установочного файла при запуске.

jest.config.js

module.exports = {
  setupTestFrameworkScriptFile: "<rootDir>/src/setupTests.ts"
}

Это указывает Jest запускать setupTest.ts каждый раз при запуске.

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

Документы Enzyme не охватывают интеграцию с Jest, поэтому объединять эти два понятия сбивает с толку.

Вот что сделало это для меня. Я даже не выгружал свое приложение из приложения create-react-app, оно просто его не поднимало!

EHorodyski 29.08.2019 14:35

Для всех, кто прочитает это в будущем, setupTestFrameworkScriptFile устарел в пользу setupFilesAfterEnv в документация в новых версиях. Мы можем добавить наш файл так:

"setupFiles": [
    "<rootDir>/src/setupTests.js"
]

Для меня при использовании React с create-react-app я должен был убедиться, что имя файла правильное. Файл должен быть src/setupTests.js с s в конце Tests.

Внутри setupTests.js находится следующее:

import { configure } from "enzyme";
import Adapter from "enzyme-adapter-react-16";

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

При запуске npm run test он автоматически находит файл setupTests.js. Нет необходимости импортировать его в каждый тестовый файл.

это работает, только когда я помещаю его в файл .test.js, как ни странно, не работает, когда я помещаю тот же код в файл setupTests.js, добавлена ​​зависимость npm i enzyme-adapter-react-16 enzyme-to-json --save-dev позволяет увидеть

Ashish Kamble 05.05.2021 14:14

Я столкнулся с той же ошибкой, и по какой-то причине React не получал файл setupTests.js автоматически.

Я создал новый файл с именем jest.config.js в корневом каталоге и добавил

{ "jest": { "setupTestFrameworkScriptFile": "<rootDir>/path/to/your/file.js", } }

После этого ошибка исчезла.

Примечание: Позже я удаленный файл jest.config.js, но он все еще работает сейчас.

Не уверен, что на самом деле было причиной проблемы!

Конфигурация файла должна быть в свойстве setupFilesAfterEnvjest.config.js.

{
  ...
  setupFilesAfterEnv: ["<rootDir>/jest.transform.js"],
  ...
}

Если кто-то сталкивается с этим при попытке исправить это после настройки Testing React Components с помощью Jest в GatsbyJs (https://www.gatsbyjs.org/docs/testing-react-components/)

В сделанном вами setup-test-env.js отредактируйте его так:

import "@testing-library/jest-dom/extend-expect"
import { configure } from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'

configure({ adapter: new Adapter() })

Создайте файл с именем setupTests.js в корне вашего проекта. jest будет автоматически искать этот файл перед запуском любых тестовых костюмов. Добавьте в файл следующее содержимое.

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

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

Примечание: имя файла должно быть точно таким же. Нет необходимости импортировать этот файл setupTests.js в ваши тестовые файлы. Он будет работать автоматически

Тем, кто использует VS Code и расширение Jest Runner для приложения React CRA, не забудьте настроить Jest Runner, чтобы использовать встроенный скрипт runner CRA, задав для команды jest значение:

npm test - --watchAll = false

Вы получите сообщение об ошибке в теме, если забудете это сделать. И поскольку вы используете CRA, вы не сможете настроить setupFilesAfterEnv ни в package.json, ни в jest.config.js. Попытка этого приведет к этой ошибке:

Эти параметры в вашей конфигурации package.json Jest в настоящее время не поддерживаются приложением Create React.

  1. npm i enzyme-adapter-react-16 enzyme-to-json --save-dev

  2. Добавить в package.jsonвведите описание изображения здесь

"jest": {
       "collectCoverageFrom": [  "src/**/*.js", "!src/index.js" ]
};
  1. Добавьте два файла в папку src ->
  • setupTests.js

  • tempPolyfills.js

  1. setupTests.js:
import requestAnimationFrame from './tempPolyfills';

        import { configure } from "enzyme";
        import Adapter from 'enzyme-adapter-react-16';

        configure({adapter: new Adapter(), disableLifecycleMethods:true});
  1. tempPolyfills.js:
const requestAnimationFrame = global.requestAnimationFrame = callback => {
          setTimeout(callback,0);
      };
export default requestAnimationFrame;
  1. в случае, если shallow -> expect () не работает в тестовом примере, используйте toJson (): Пример :
    import { shallow } from "enzyme";
    import App from "./App";
    import toJson from 'enzyme-to-json';
    describe('App', () => {
        const app = shallow(<App />);
        it('renders correctly', () => {
            expect(toJson(app)).toMatchSnapshot();
        });
     });

Если вы думаете, что в остальном настроили все правильно (например, у вас установлена ​​поддержка @ wojtekmaj / энзим-адаптера-реакции-17 для поддержки React 17), еще одна ошибка, которую нужно проверить с помощью Typescript:

У тебя есть

"esModuleInterop": true,

и соответствующий формат импорта для адаптера?

import Adapter from '@wojtekmaj/enzyme-adapter-react-17';
import Enzyme from 'enzyme';

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