我有一个使用redux表单的注册React组件,我的onSubmit基本上发送一个异步操作。我正在尝试使用Ezyme和Jest测试我的组件,方法是向我的分派添加一个间谍,并检查是否在模拟表单提交时调用分派。然而,我的测试失败了。
这是我的注册redux表单组件:
import React from 'react';
import {reduxForm, Field, focus} from 'redux-form';
import Input from './input';
import {required, nonEmpty, email, isTrimmed, length} from '../validators';
import {registerUser} from '../actions/users';
import {login} from '../actions/auth';
export class SignUpForm extends React.Component {
onSubmit(values) {
const {username, password, fname, lname} = values;
const newUser = {
username,
password,
user: {
firstName: fname,
lastName: lname
}
};
return this.props
.dispatch(registerUser(newUser))
.then(() => this.props.dispatch(login(username, password)));
}
render() {
let errorMessage;
if (this.props.error) {
errorMessage = (
<div className="message message-error">{this.props.error </div>
);
}
return (
<form className='signup-form' onSubmit={this.props.handleSubmit(values =>
this.onSubmit(values)
)}>
{errorMessage}
<Field
name="fname"
type="text"
component={Input}
label="First Name"
validate={[required, nonEmpty]}
/>
<Field
name="lname"
type="text"
component={Input}
label="Last Name"
validate={[required, nonEmpty]}
/>
<Field
name="username"
type="email"
component={Input}
label="Email"
validate={[required, nonEmpty, email, isTrimmed]}
/>
<Field
name="password"
type="password"
component={Input}
label="Password"
validate={[required, nonEmpty, length({min: 10, max: 72})]}
/>
<button
type="submit"
disabled={this.props.pristine || this.props.submitting}>
Sign Up
</button>
</form>
);
}
}
export default reduxForm({
form: 'signup',
onSubmitFail: (errors, dispatch) =>
dispatch(focus('signup', Object.keys(errors)[0]))
})(SignUpForm);
这是我的测试:
import React from 'react';
import {shallow, mount} from 'enzyme';
import SignUpForm from './signup';
import {registerUser} from '../actions/users';
import { reducer as formReducer } from 'redux-form'
import { createStore, combineReducers, applyMiddleware } from 'redux'
import { Provider } from 'react-redux'
import thunk from 'redux-thunk';
import {stockReducer} from '../reducers';
describe('<SignUpForm />', () => {
let store
let wrapper
let dispatch
beforeEach(() => {
store = createStore(combineReducers({ form: formReducer, stock: stockReducer }),applyMiddleware(thunk))
dispatch = jest.fn()
wrapper = mount(
<Provider store={store}>
<SignUpForm dispatch={dispatch}/>
</Provider>
);
})
it('should fire onSubmit callback when form is submitted', (done) => {
const form = wrapper.find('form');
form.find('#fname').simulate('change', {target: {value: 'fname'}});
form.find('#lname').simulate('change', {target: {value: 'lname'}});
form.find('#username').simulate('change', {target: {value: 'fname@email.com'}});
form.find('#password').simulate('change', {target: {value: 'password1234'}});
form.simulate('submit');
expect(dispatch).toHaveBeenCalled();
});
});
我的测试失败,出现以下错误:expect(jest.fn())。ToHaveBeenCall()预期已调用模拟函数。
请帮我弄明白出了什么问题。
这里的问题是,在对onSubmit函数返回的promise进行测试时,您没有在任何地方等待,因此您的断言将在promise解决之前执行
我建议您适当地重构代码,使其“可测试”。关于如何使用jest测试异步调用,您可以查看以下链接:https://facebook.github.io/jest/docs/en/asynchronous.html
我还建议你使用redux thunk,这会让你的生活更轻松。
import { CounterActions, INCREMENT_COUNTER, DECREMENT_COUNTER, } from './counter'; // Mock out the NgRedux class with just enough to test what we want. class MockRedux extends NgRedux<any> { c
我不熟悉react和redux技术。现在开始构建一个包含多个redux表单的应用程序。我们希望提交带有值的简单表单。 例如:登录表单 用户名:文本输入字段 密码:文本输入字段 提交按钮 在字段中输入值并单击submit按钮后,我想在object或json数据中获取用户名和密码字段值。。这样我就可以用POST方法将它存储到我的服务器上。 现在我们正在使用handleSubmit(),但数据不是作为对
我正在为一个Angular 4组件编写一个测试,该组件是一个登录表单。可以通过单击“提交”按钮或在任何输入字段中按enter来提交表单。这种行为是由角度形式指令规定的。 我可以编写一个测试用例来验证单击按钮是否提交表单,但我不能用keypress事件触发提交行为。 从按钮分派'Click'事件的测试通过,但从输入元素分派keydown事件的测试(当前已禁用)失败。 我是否可以分派不同的事件来触发窗
下面是MultistepForm的代码。我已经实现了一个多步骤表单功能,所以这里一切都很好,只是问题是在这个表单中,我在最后一步有一个预览页面,所以当我点击提交按钮时,表单正在消失,按钮正在顶部移动。所以如果有人能帮我请。
在学习了一些Redux和react的教程后,我刚刚开始尝试react,但在控制台中出现了一个错误: 警告:不能给无状态函数组件提供refs(请参见登录创建的FieldGroup中的ref“username”)。访问此引用的尝试将失败。 将表单字段输入值传递给“提交”按钮的正确方法是什么?这些值应该进入redux存储吗?在阅读了文档:https://reactjs.org/docs/refs-and
我在一个基于Spring的Web应用程序(版本4.1.6。RELEASE,Spring Security 4.0.0。RELEASE)中工作,我收到错误(POST方法)。根据Spring的留档“Spring Security自动为任何