【问题标题】:How to test the redux form in jest如何开玩笑地测试 redux 表单
【发布时间】:2019-06-18 11:37:27
【问题描述】:

我正在使用其中包含 reduxform 的无状态组件。我正在尝试为登录表单编写单元测试以获取输入详细信息以及模拟点击表单。但我不知道从哪里开始,因为我是开玩笑的新手。

我尝试创建快照以及创建模拟商店。

登录表单组件:

import logo from 'assets/img/logo/logo_200.png';
import LoadingButton from 'components/LoadingButton';
import ReduxFormInput from 'components/ReduxFormInput';
import { password } from 'lib/normalize';
import React from 'react';
import { Form } from 'reactstrap';
import { Field, reduxForm } from 'redux-form';
import validate from './validate';

const SignInForm = (props: any) => {
  const { handleSubmit, isLoading } = props;
  return (
    <Form onSubmit={handleSubmit}>
      <div className="text-center pb-4">
        <img src={logo} className="rounded" style={{ width: 60, height: 60 }} alt="logo" />
      </div>
      <Field
        name="email"
        component={ReduxFormInput}
        placeHolder="your@email.com"
        label="Email"
        type="email"
      />
      <Field
        name="password"
        component={ReduxFormInput}
        placeHolder="your password"
        label="Password"
        type="password"
        normalize={password}
      />
      <hr />
      <LoadingButton
        text="Login"
        loadingText="Logging in"
        isLoading={isLoading}
        size="lg"
        block={true}
      />
    </Form>
  );
};

export default reduxForm({
  form: 'signIn',
  validate,
})(SignInForm);

Redux 表单输入组件:

import React from 'react';
import { FormGroup, Input, Label } from 'reactstrap';
import 'styles/splash-scripts.css';

const ReduxFormInput: React.FC = (field: any) => (
  <FormGroup>
    <Label>{field.label}</Label>
    <Input {...field.input} type={field.type} placeholder={field.placeHolder} />
    {field.meta.touched && <p className="text-danger">{field.meta.error}</p>}
  </FormGroup>
);

export default ReduxFormInput;

测试文件:

import React from 'react';
import { shallow, mount, render } from 'enzyme';
import { Provider } from "react-redux";
import renderer from 'react-test-renderer';
import configureMockStore from "redux-mock-store";

import SignInForm from '../../src/pages/Public/SignIn/SignInForm';

const mockStore = configureMockStore();
const store = mockStore({});


const defaultProps = {
  submitting: false,
  handleSubmit: () => {},
  invalid: false,
  initialValues: {},
};
describe("Login Component", () => {

  it('should match the snapshot', () => {
      const wrapper = renderer.create(
        <Provider store={store}>
            <SignInForm />
        </Provider>
    ).toJSON();
      expect(wrapper).toMatchSnapshot();
  });

  it('it renders a <form /> element', () => {
    const wrapper = shallow(
      <Provider store={store}>
         <SignInForm {...defaultProps} />
      </Provider>
    ).dive();
  });
});

我尝试过使用

    const emailState = wrapper.state().email;
    const passwordState = wrapper.state().password;
    expect(emailState).toEqual('');
    expect(passwordState).toEqual('');

但我遇到了错误

error: reactwrapper::state() can only be called on class components

【问题讨论】:

  • 您是否尝试在测试中的某处设置您所在州的电子邮件?通常,您会使用所需的任何状态初始化存储,然后从中检查组件的渲染。你想达到什么目的?
  • @WillJenkins 不,我没有以状态存储电子邮件或密码,因为我使用的是 redux 表单,它将存储在商店中。我正在尝试检查输入是否为电子邮件类型并提供电子邮件地址和密码并尝试模拟单击按钮

标签: reactjs redux jestjs redux-form


【解决方案1】:

正如错误所说,您不能在reactWrapper 上调用state()。从您的评论来看,您似乎正在尝试检查空电子邮件和密码字段的类型和内容。如果是这种情况,您可以这样命名find

const emailField = wrapper.find('[name="email"]')
const passwordField = wrapper.find('[name="password"')

然后您可以根据需要检查值和类型。

【讨论】:

  • 我已经尝试了上述方法,但我收到了类似这样的错误 expect(received).toBe(expected) // Object.is 相等 预期:“”收到:{}
  • emailFieldpassWordField 是组件。检查例如你可以使用的值emailField.instance().value
  • 添加了 instance().value,但在类型“组件”上不存在属性“值”之类的错误。删除值并检查但随后错误就像 ShallowWrapper::instance() 只能在根上调用
  • 尝试检查 emailField.debug() 以检查正在呈现的内容
  • 为空无数据
猜你喜欢
  • 2018-09-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多