$npx create-react-app react-enzyme-test
$yarn add enzyme
(non-officiel)
: il n'y a pas encore version officielle.$yarn add @wojtekmaj/enzyme-adapter-react-17
import { configure } from "enzyme";
import Adapter from "@wojtekmaj/enzyme-adapter-react-17"
configure({ adapter: new Adapter() });
$yarn add enzyme-to-json
"jest": {
"snapshotSerializers": [
"enzyme-to-json/serializer"
]
},
import React from "react";
function Profile({ username, name }) {
return (
<div>
<b>{username}</b>
<span>({name})</span>
</div>
);
}
export default Profile;
- .props(): acces au props
- .find() : comme querySelector("") en DOM
- .toMatchSnapshot() : prendre la snapshot & vérifier si cette snapshot est pareil que celle précédante
describe("<Profile/>", () => {
it("matches snapshot", () => {
const wrapper = mount(<Profile username="jeanoza" name="kyubong" />);
expect(wrapper).toMatchSnapshot();
});
it("renders username and name", () => {
const wrapper = mount(<Profile username="jeanoza" name="kyubong" />);
expect(wrapper.props().username).toBe("jeanoza");
expect(wrapper.props().name).toBe("kyubong");
const boldElement = wrapper.find("b");
expect(boldElement.contains("jeanoza")).toBe(true);
});
});
$yarn test
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`<Profile/> matches snapshot 1`] = `
<Profile
name="kyubong"
username="jeanoza"
>
<div>
<b>
jeanoza
</b>
<span>
(
kyubong
)
</span>
</div>
</Profile>
`;
- .shallow(): rendre seulementle composant
- .mount() : rendre le composant et son sous-composant
- .find(text) : cherche nodes qui correspond au text-là
- .findWhere(boolean) : cherche nodes qui correspond au boolean-là
- .simulate(event) : simule event-là
it("call handlePlus", () => {
//cherche node qui correspond à la condition
const wrapper = shallow(<Counter />);
const plusButton = wrapper.findWhere(
(node) => node.type() === "button" && node.text() === "+1"
);
//simulation d'un event (click dans ce cas)
plusButton.simulate("click");
expect(wrapper.state().number).toBe(1);
});
on ne peut utiliser ni
.instance()
ni.state()
avec HOOK(dans le composant fonctionnel)=> il faut utiliser
.find()
pour accedernumber
=> donc, ce que l'on teste ici, ce n'est pas
state.number
mais auHTML element.text()
.
import React, { useState } from "react";
function HookCounter() {
const [number, setNumber] = useState(0);
const handlePlus = () => {
setNumber((prev) => prev + 1);
};
const handleMinus = () => {
setNumber((prev) => prev - 1);
};
return (
<div>
<h2>{number}</h2>
<button onClick={handlePlus}>+1</button>
<button onClick={handleMinus}>-1</button>
</div>
);
}
export default HookCounter;
import { mount } from "enzyme";
import HookCounter from "./HookCounter";
describe("<Counter/>", () => {
it("matches snapshot", () => {
const wrapper = mount(<HookCounter />);
expect(wrapper).toMatchSnapshot();
});
it("call handlePlus", () => {
const wrapper = mount(<HookCounter />);
const plusButton = wrapper.findWhere(
(node) => node.type() === "button" && node.text() === "+1"
);
plusButton.simulate("click");
plusButton.simulate("click");
//en Hook, incapable d'utiliser .state(), => trouver element HTML avec .find()
const number = wrapper.find("h2");
//.text() rend string
expect(number.text()).toBe("2");
expect(number.text()).toBe("2");
});
it("call handleMinus", () => {
const wrapper = mount(<HookCounter />);
const minusButton = wrapper.findWhere(
(node) => node.type() === "button" && node.text() === "-1"
);
minusButton.simulate("click");
minusButton.simulate("click");
const number = wrapper.find("h2");
expect(number.text()).toBe("-2");
});
});