Почему неглубокий рендеринг не работает так, как ожидалось?
Я использую фермент для проверки моего create-react-app
компонент, но не работал интуитивно. Я неправильно понимаю, что такое мелкий рендеринг?
import React from "react";
import { Card } from "./Card";
const TestUser = () => {
return (
<div>
<div className="test" />
<div className="wrapper">
<Card />
<Card />
<Card />
</div>
</div>
);
};
export default TestUser;
.test.js
import React from "react";
import TestUser from "./TestUser";
import { shallow } from "enzyme";
import { Card } from "./Card";
it("should render right", () => {
const component = shallow(<TestUser />);
expect(component.find(Card)).to.have.length(3);
});
Я ожидаю, что он должен пройти тест, потому что он имеет 3 Card
компоненты в TestUser
Но вывод: TypeError: Невозможно прочитать свойство 'иметь' из неопределенного
Как это работает?
4 ответа
У меня такая же проблема. Это решено с помощью приведенного ниже.
Я создал jest.config.js
файл на корневом уровне и добавьте ниже код.
module.export ={
setupFiles:[ '<rootDir>/src/setUpTests.js']
}
Я создал setUpTests.js
файл и добавьте ниже код.
import { configure } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
configure({ adapter: new Adapter() });
И решил мою проблему.
Попробуйте это. Вы должны дать его как строковый литерал. Также для меня expect
библиотека, которую вы используете, не та, из которой вы получаете chai
и может иметь различный набор вспомогательных методов, что приводит к этой ошибке. К сожалению, у меня нет кода для проверки. Ничего плохого в мелком рендеринге нет вообще.
import React from "react";
import TestUser from "./TestUser";
import { shallow } from "enzyme";
import { expect } from 'chai';
it("should render right", () => {
const component = shallow(<TestUser />);
expect(component.find('Card')).to.have.length(3);
});
Также вам не нужно иметь это заявление здесь, import Card from "./card";
В компоненте TestUser измените оператор импорта следующим образом.
import Card from "./card";
Так что теперь ваш TestUser
Компонент должен выглядеть следующим образом.
import React from "react";
import Card from "./card";
const TestUser = () => {
return (
<div>
<div className="test" />
<div className="wrapper">
<Card />
<Card />
<Card />
</div>
</div>
);
};
export default TestUser;
Используйте следующую команду для установки chai
библиотека.
npm install --save chai
Если вы действительно хотите использовать Jest, измените свое утверждение, как показано ниже.
import React from "react";
import TestUser from "./testuser";
import { shallow } from "enzyme";
it("should render right", () => {
const component = shallow(<TestUser />);
expect(component.find('Card')).toHaveLength(3);
});
Лично мне нравится мокко из-за его свободного API.
Надеюсь это поможет. Удачного кодирования!
В этом случае мелкий рендеринг не будет таким глубоким, как вы хотите div
вложенности. http://airbnb.io/enzyme/docs/api/shallow.html
Либо использовать mount
или использовать .dive()
API, чтобы идти на один уровень дальше. Смотрите пример в документации по ферментам: http://airbnb.io/enzyme/docs/api/ShallowWrapper/dive.html
Используйте ().toEqual() вместо.to.have.length(), так как.to.have не является какой-либо функцией в библиотеке ожидающих шанса. Посетите здесь для получения дополнительной информации.
import React from "react";
import TestUser from "./testuser";
import { shallow } from "enzyme";
it("should render right", () => {
const component = shallow(<TestUser />);
expect(component.find('Card').length).toEqual(3);
});
it("should render right", () => {
const component = shallow(<TestUser />);
const element = component.find('wrapper');
chai.expect(element.props.children).to.have.length(3);
});