【发布时间】:2021-05-13 21:22:39
【问题描述】:
以下是我的学习应用程序中的一个简单登录组件。
我正在尝试通过 jest 和 testing-library/react 编写以下组件的测试
import React, { useEffect } from 'react';
import { Form, Input, Button, Checkbox } from 'antd';
import { connect } from "react-redux";
import { userLoginThunk } from "../Thunk/LoginThunk";
import { getUserState } from '../selector';
const Login = ({ onFormSubmitFailed, onLoginPressed, history }) => {
const layout = {
labelCol: { span: 8 },
wrapperCol: { span: 8 },
};
const tailLayout = {
wrapperCol: { offset: 8, span: 16 },
};
const onFinish = (values) => {
onLoginPressed(values, history);
};
const onFinishFailed = (errorInfo) => {
onFormSubmitFailed();
};
return (
<Form data-testid="loginForm"
{...layout}
style={{
padding: '30vh',
alignItems: 'center'
}}
name="basic"
initialValues={{ remember: true }}
onFinish={onFinish}
onFinishFailed={onFinishFailed}
>
<Form.Item
label="Username"
name="username"
rules={[{ required: true, message: 'Please input your username!' }]}
>
<Input data-testid="UsernameInput" placeholder="UserName" />
</Form.Item>
<Form.Item
label="Password"
name="password"
rules={[{ required: true, message: 'Please input your password!' }]}
>
<Input.Password data-testid="PasswordInput" placeholder="Password" />
</Form.Item>
<Form.Item {...tailLayout}>
<Button data-testid="submitButton" type="primary" htmlType="submit">
Submit
</Button>
</Form.Item>
</Form>
);
};
// const mapStateToProps = state => ({
// logingIn: getUserState(state),
// });
// const mapDispatchToProp = dispatch => ({
// onLoginPressed: (userObj, history) => dispatch(userLoginThunk(userObj, history)),
// });
export default connect((state) => ({
logingIn: getUserState(state)
}), {
onLoginPressed: (userObj, history) => userLoginThunk(userObj, history)
})(Login);
//export default connect(mapStateToProps, mapDispatchToProp)(Login);
我在讨论中读到我们不需要 mapStateToProps、mapDispatchToProp,所以我也删除了它们,但我的测试仍然失败。
我想要实现的是传递一个模拟函数作为道具并记录它被执行一次,因为我的
onFinish 函数在我的登录组件中被调用,但是当我已经通过了我的模拟 jest 函数作为它没有执行并通过我的测试的道具。
test.only("Login On Submit", () => {
const onLoginPressed = jest.fn();
//(() => {throw new Error('QWERTY')});
// // (values, history) => {
// // console.log('Test');
// // console.log('inside Test', values)
// // }
const { getByTestId } = render(
<Provider store={storeMock}>
<Login onLoginPressed={onLoginPressed} />
</Provider>
);
fireEvent.change(screen.getByTestId(/UsernameInput/i), {
target: { value: 'admin' }
});
fireEvent.change(screen.getByTestId(/PasswordInput/i), {
target: { value: 'admin' }
});
fireEvent.click(screen.getByTestId("submitButton"));
expect(onLoginPressed).toHaveBeenCalled();
});
测试结果 期望(jest.fn()).toHaveBeenCalled()
Expected number of calls: >= 1
Received number of calls: 0
90 | fireEvent.click(screen.getByTestId("submitButton"));
91 | console.log("debug after testUtil render", debug());
> 92 | expect(onLoginPressed).toHaveBeenCalled();
| ^
93 |
94 | });
95 | });
【问题讨论】:
标签: javascript reactjs react-redux jestjs react-testing-library