【发布时间】:2020-07-23 09:51:10
【问题描述】:
嗨,最近我正在用 jest+enzyme 测试我的反应应用程序, 用 useState 或 useEffect 编写测试让我很困惑..
所以这是我的代码,我想测试当用户单击按钮时,描述是否显示。(通过更改状态值)
const Job = ({ job }) => {
const [isOpen, setIsOpen] = useState(false);
const toggle = (id) => {
setIsOpen(!isOpen);
};
return (
<Card>
<Card.Text>
<Button id="button" onClick={toggle} variant="primary">
{!isOpen ? "View Detail" : "Hide Detail"}
</Button>
</Card.Text>
{isOpen && (
<div className="mt-4">
<ReactMardown source={job.description} />
</div>
)}
</Card>
);
};
export default Job;
Job.test.js
import React from "react";
import Adapter from "enzyme-adapter-react-16";
import { mount, shallow, configure } from "enzyme";
import Job from "./Job";
configure({ adapter: new Adapter() });
describe("when user click the button state value should changed", () => {
const job = jest.fn();
let wrapper;
beforeEach(() => {
wrapper = mount(<Job job={job} />);
});
it("should render", () => {
expect(wrapper).not.toBeNull();
});
test("user click button", () => {
const setIsOpen = jest.fn();
wrapper.find("#button").at(1).simulate("click");
expect(setIsOpen).toHaveBeenLastCalledWith({ isOpen: false });
});
});
但它只通过了第一次测试..
【问题讨论】:
-
是否应该
expect(setIsOpen).toHaveBeenLastCalledWith({ isOpen: false });不与真比较,因为单击时值会恢复?另外我不确定 jest API,但您提供setIsOpen一个布尔值,但检查对象