Я создал новое приложение 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() })
Вы знаете, что может решить эту проблему?
@CrazySynhax, примите еще один ответ от '@Mikel', потому что он делает конфигурацию доступной, и ваши тесты будут выглядеть более понятными. Такая явная конфигурация в каждом тесте слишком многословна.





Добавьте import React from 'react'; в начало файла.
Вы используете JSX-синтаксис <MessageBox app = {app}/>, который транспилес превращается в React.createComponent(...). Для того, чтобы это работало, переменная React должна быть определена в области действия файла.
Спасибо. Но это создало другую проблему. Я отредактировал свой вопрос.
Файл setupTests необходимо импортировать в тестовый файл:
import MessageBox from "../MessageBox";
import { shallow } from 'enzyme';
import React from 'react';
import "../setupTests"
test('message box', ()=> {
...
})
это то, что исправило это для меня.
Это было единственное, что у меня работало, но я заметил, что это проблема только в расширении Jest Runner для VS Code, поэтому я нашел для него несколько конфигураций. См. мой пост.
Добавьте его в свой файл тестового случая.
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';, прежде чем он заработает.
что, если вы не хотите использовать это в каждом тесте?
Пожалуйста, дополните ответ первым комментарием. Так что это будет полезно для других
Это похоже на то, что следует ввести в Enzyme как «разумное значение по умолчанию». Весь этот конфигурационный шум утомляет.
Спасибо! Это действительно помогло мне исправить другой тест :)
@MaxwellLynn Вы можете создать файл setup.js. Проверить ссылку. github.com/airbnb/enzyme/issues/1265
Если вы создадите setupTests.js, поместите его в каталог src и добавите конфигурацию фермента, он должен работать.
Думаю, в ответе следует упомянуть, что import и configure необходимо вставить в setupTests.js.
Вам нужно использовать импорт следующим образом:
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
Чтобы получить полезный ответ, эту реакцию нужно расширить. Объясните, почему это ответ на вопрос.
для людей, использующих приложение creat-response-app, вам не нужно делать запись в файле package.json. просто создайте setupTests.js в src, и он будет выбран автоматически. Также просто импортируйте адаптер, а не * как адаптер
Вот дополнительная информация, подтверждающая комментарий Приянка: github.com/airbnb/enzyme/issues/1265 Микель приводит пример файла src / setupTests.js в другом ответе.
Попробуй вот так;
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. Я обновлю свой ответ до последней версии. Спасибо
Как Приянк сказал, если вы используете приложение Create React, оно получит конфигурацию из src/setupTests.js.
Добавлять:
import { configure } from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'
configure({ adapter: new Adapter() })
зачем нам нужен адаптер, как и в официальных документах, также говорится об использовании адаптера, но зачем он нужен. Новичок в шутках и энзимах. Я не знаю, хороший это вопрос или нет
В моем случае вместо того, чтобы называть файл конфигурации «setupTests.js», я назвал его «setUpTests.js». когда я сменил название, это сработало.
Это работает. Для проектов Typescript он должен иметь расширение .ts: src / setupTests.ts
Многие ответы говорят об импорте setupTests.js в ваш тестовый файл. Или же
настроить адаптер фермента в каждом тестовом файле. Что решает насущную проблему.
Но в долгосрочной перспективе, если вы добавите файл jest.config.js в корень проекта. Вы можете настроить его для запуска установочного файла при запуске.
module.exports = {
setupTestFrameworkScriptFile: "<rootDir>/src/setupTests.ts"
}
Это указывает Jest запускать setupTest.ts каждый раз при запуске.
Таким образом, если вам нужно добавить полифиллы или добавить глобальный макет, например localstorage, вы можете добавить его в свой файл setupTests и настроить его везде.
Документы Enzyme не охватывают интеграцию с Jest, поэтому объединять эти два понятия сбивает с толку.
Вот что сделало это для меня. Я даже не выгружал свое приложение из приложения create-react-app, оно просто его не поднимало!
Для всех, кто прочитает это в будущем, 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 позволяет увидеть
Я столкнулся с той же ошибкой, и по какой-то причине 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.
npm i enzyme-adapter-react-16 enzyme-to-json --save-dev
Добавить в package.jsonвведите описание изображения здесь
"jest": {
"collectCoverageFrom": [ "src/**/*.js", "!src/index.js" ]
};
setupTests.js
tempPolyfills.js
setupTests.js:import requestAnimationFrame from './tempPolyfills';
import { configure } from "enzyme";
import Adapter from 'enzyme-adapter-react-16';
configure({adapter: new Adapter(), disableLifecycleMethods:true});
tempPolyfills.js:const requestAnimationFrame = global.requestAnimationFrame = callback => { setTimeout(callback,0); }; export default requestAnimationFrame;
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';
Текущее сообщение об ошибке на дату этого комментария также имеет URL-адрес документации. Посещение этого URL-адреса в основном объясняет, что делать.