【问题标题】:Method “simulate” is only meant to be run on a single node. 0 found instead方法“模拟”仅用于在单个节点上运行。找到了 0 个
【发布时间】:2020-02-08 20:16:57
【问题描述】:

我正在学习反应酶,但我正面临这个问题,任何人都可以帮助我。我正在尝试在更改用户名和密码时测试注册页面,但我遇到了这个问题

//注册页面.js

import React from 'react'
import { Component } from 'react';
import { Link } from 'react-router-dom';
import { connect } from 'react-redux';
import { userActions } from '../actions';

export class RegisterPage extends Component {
constructor(props) {
    super(props);

    this.state = {
        user: {
            username: '',
            password: ''
        },
        submitted: false
    };

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
}
    handleChange(event) {
    const { name, value } = event.target;
    const { user } = this.state;
    this.setState({
        user: {
            ...user,
            [name]: value
        }
    });
}

handleSubmit(event) {
    event.preventDefault();
    // handle button click and dispatch register
    const { user } = this.state;
    if (user.username && user.password) {
        this.props.dispatch(userActions.register(user))
    }else{
     this.setState({submitted:true})   
    }
}

render() {
    const { user, submitted } = this.state;
    const { registering  } = this.props;
    return (
        <div className="col-md-6 col-md-offset-3">
            <h2>Register</h2>
            <form name="form"  onSubmit={this.handleSubmit}>
                <div className={'form-group' + (submitted && !user.username ? ' has-error' : '')}>
                    <label htmlFor="username">Username</label>
                    <input value={user.username} onChange={this.handleChange} type="text" className="form-control username" name="username" />
                    {submitted && !user.username &&
                        <div className="help-block">Username is required</div>
                    }
                </div>
                <div className={'form-group' + (submitted && !user.password ? ' has-error' : '')}>
                    <label htmlFor="password">Password</label>
                    <input value={user.password} onChange={this.handleChange} type="password" className="form-control" name="password"/>
                    {submitted && !user.password &&
                        <div className="help-block">Password is required</div>
                    }
                </div>
                <div className="form-group">
                    <button className="btn btn-primary">Register</button>
                    <Link to="/login" className="btn btn-link">Cancel</Link>
                </div>
            </form>
        </div>
    );
}
}
function mapStateToProps(state) {
return {
    ...state
}
RegisterPage=connect(mapStateToProps)(RegisterPage)
export default RegisterPage;

这是我写的测试用例,我是酶的新手,所以不知道这将如何工作 //注册页面.test.jsenter image description here

import React from 'react';
import ReactDOM from 'react-dom';
import expect from 'expect';
import TestRegisterPage from '../components/RegisterPage';
import { App } from '../App';
import { configure } from 'enzyme';
import { Link } from 'react-router-dom';
import { MemoryRouter } from 'react-router'
import Adapter from 'enzyme-adapter-react-16';
import { mount, shallow } from 'enzyme';
import { PropTypes } from 'prop-types';
import renderer from 'react-test-renderer';
import {spy} from 'sinon';
import { Provider } from 'react-redux';
import { store } from '../helpers';
import configureStore from 'redux-mock-store';

const middlewares = [];
const mockStore = configureStore(middlewares);
configure({ adapter: new Adapter() });
let mockedStore = mockStore({});
export const CustomProvider = ({ children }) => {
  return (
    <Provider store={store}>
      <MemoryRouter>
        {children}
      </MemoryRouter>
    </Provider>
  );
};

describe("Test RegisterPage component", () => {
  it('check route, dispatch and store setup for component', () => {
    const wrapper = mount(
      <CustomProvider>
        <TestRegisterPage dispatch={spy()} />
      </CustomProvider>
      {
        context: {store: mockedStore},
        childContextTypes: {store: PropTypes.object.isRequired}
      }
    );

    const inst = wrapper.children();
    let uname = inst.find('.username');
    let pwd = inst.find('.password');
    uname.simulate('change', { target: { value: "demo_username" } });
    pwd.simulate('change', { target: { value: "demo_password" } });
    wrapper.update();
    expect(wrapper).toBeTruthy();
  });
});

【问题讨论】:

    标签: javascript reactjs enzyme


    【解决方案1】:

    您可以通过name 选择器获取输入,而无需获取子项:

    let uname = wrapper.find('input[name="username"]');
    let pwd =  wrapper.find('input[name="password"]');
    
    uname.simulate('change',{ target: {value: "demo_username"} });
    pwd.simulate('change', { target: { value: "demo_password" } });
    

    【讨论】:

    • 我还需要一个帮助 @Clarity 你能帮我解决另一个问题吗?
    • 我在这里做错了什么const children = shallow(&lt;HomePage /&gt;); expect(children.find(Link)).to.have.length(1);@Clarity?
    • @vikramkakkar 尝试使用mount 而不是shallow 来渲染嵌套组件。
    • 在此之后我遇到此错误@Clarity Invariant Violation: You should not use outside a
    • 添加了这个链接const children = mount(&lt;Provider store={store}&gt;&lt;HomePage /&gt;&lt;/Provider&gt;);
    猜你喜欢
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2017-02-02
    • 2019-03-16
    • 2016-09-19
    • 2019-07-20
    相关资源
    最近更新 更多