【发布时间】:2020-07-17 21:30:17
【问题描述】:
以下是我尝试使用 jest / enzyme 测试的 React 功能组件。
React 功能组件代码 -
export const UserForm = props => {
const {labels, formFields, errorMessages} = props;
const [showModal, setShowModal] = React.useState(false);
const [newId, setNewId] = React.useState('');
const showModal = () => {
setShowModal(true);
}
const closeModal = () => {
setShowModal(false);
};
const handleSubmit = data => {
Post(url, data)
.then(resp => {
const userData = resp.data;
setNewId(() => userData.id);
showModal();
})
}
return (
<div className="user-form">
<UserForm
fields={formFields}
handleSubmit={handleSubmit}
labels={labels}
errors={errorMessages}
/>
{showModal && <Modal closeModal={closeModal}>
<div className="">
<h3>Your new id is - {newId}</h3>
<Button
type="button"
buttonLabel="Close"
handleClick={closeModal}
classes="btn btn-close"
/>
</div>
</Modal>}
</div>
)
};
现在我正在尝试测试showModal、closeModal 和handleSubmit 方法,但我的测试失败了。让我知道在功能组件中测试 React Hooks 和方法的正确方法。
我的测试用例 -
import React from 'react';
import { UserForm } from '../index';
import { shallow } from 'enzyme';
describe('<UserForm />', () => {
let wrapper;
const labels = {
success: 'Success Message'
};
const formFields = [];
const errorMessages = {
labels: {
firstName: 'First Name Missing'
}
};
function renderShallow() {
wrapper = shallow(<UserForm
labels={labels}
formFields={formFields}
errorMessages={errorMessages}
/>);
}
it('should render with props(snapshot)', () => {
renderShallow();
expect(wrapper).toMatchSnapshot();
});
it('should test showModal method', () => {
const mockSetShowModal = jest.fn();
React.useState = jest.fn(() => [false, mockSetShowModal]);
renderShallow();
expect(mockSetShowModal).toHaveBeenCalledWith(true);
});
});
我得到的错误 -
Expected mock function to have been called with:
[true]
But it was not called.
让我知道如何在功能组件中测试showModal、closeModal 和handleSubmit 方法。
【问题讨论】:
-
你不应该只是在
expect(mockSetShowModal)...行之前添加模拟函数mockSetShowModal(true)的调用吗?
标签: javascript reactjs ecmascript-6 jestjs enzyme