繁体   English   中英

React / Jest / Enzyme:如何测试向输入中添加文本并检查该文本?

[英]React/Jest/Enzyme: How to test adding text to input and checking for that text?

我们有一个带有简单输入和提交按钮的表单。 提交后,会在section.user-list添加li。

输入ni并单击“ 搜索”按钮后,2 lis将进入视图,其中一个包含“ Nick Sims”

在此处输入图片说明

在此处输入图片说明

但是,在运行以下测试之后,视图从未改变,测试将选择默认的“搜索用户”字符串,该字符串应由新的lis替换。

请注意,在我们的应用程序中,有一个调度函数,该函数调用Redux动作到SEARCH_USERS以返回用户列表,这可能是问题吗?

在此处输入图片说明

import React from 'react'
import { shallow, mount } from 'enzyme'
import toJson from 'enzyme-to-json'

import { UserListContainer } from './UserListContainer'

const userListContainer = mount(<UserListContainer />);

describe('<UserListContainer /> tests', () => {
    let wrapper;

    beforeAll(() => {
        wrapper = mount(<UserListContainer searchUser={() => {}} />);
    });

    it('Should contain an input', () => {
        expect(wrapper.find('input')).toHaveLength(1);
    });

    it('Should show User after a user searches', () => {
        expect(wrapper.find('input.input-user')).toHaveLength(1);
        wrapper.find('input.input-user').simulate('keydown', { which: 'r' });
        wrapper.find('input.input-user').simulate('keydown', { which: 'o' });

        const text = wrapper.find('input.input-user').text();
        const value = wrapper.find('input.input-user').get(0).value;

        console.log('value:', value)
        console.log('text:', text)

        wrapper.find('button.btn-blue').simulate('click');

        expect(wrapper.find('.user-population li').text()).toEqual('Nick Sims');
    });
});

UserListContainer(智能)

import React, { Component } from "react"
import { connect } from 'react-redux'
import { UserList } from '../../components'
import { searchUser } from '../../actions'

export class UserListContainer extends Component {
    constructor(props) {
        super(props);
    }

    onFormSubmit(e, user) {
        e.preventDefault();
        this.props.searchUser(user)
    }

    render() {
        return (
            <div className='users-container'>
                <UserList
                    users={this.props.users}
                    lastUserSearched={this.props.lastUserSearched}
                    onFormSubmit={this.onFormSubmit.bind(this)}
                />
            </div>
        )
    }
}

const mapStateToProps = (state) => {
    return {
        users: state.usersReducer.users,
        lastUserSearched: state.usersReducer.lastUserSearched
    }
}

const mapDispatchToProps = (dispatch) => {
    return {
        searchUser: (user) => {dispatch(searchUser(user))},
    }
}

const userList = UserListContainer;
export default connect(mapStateToProps, mapDispatchToProps)(userList)

用户列表(哑)

import React from 'react'
import { Link } from 'react-router-dom'

export default class UserList extends React.Component {
  constructor(props) {
    super(props);
  }

  onFormSubmit(e) {
    const value = this.input.value;
    this.props.onFormSubmit(e, value);
  }

  populateUsers() {
    const users = this.props.users;
    if(!this.props.lastUserSearched) {
      return <li>Search for a user</li>
    }

    { /* Search / Auto Suggest functionality */ }
    const regex = this.props.lastUserSearched;
    let re = new RegExp(regex, "gi");

    let filteredUsers = users.filter(v => {
      if(v.name.match(re)) {
        return v;
      }
      return;
    });

    if(filteredUsers.length < 1) {
      return <li>No users found with that name</li>
    }

    return filteredUsers.map(x => {
      return (
        <li key={x._id}>
          <Link to="#" className="user-link">
            { x.name }
          </Link>
        </li>
      )
    });
  }

  render () {
    return (
      <section className="user-list">
        <form onSubmit={ this.onFormSubmit.bind(this) }>
          <label>
            <input
              type="text"
              className="input-user"
              placeholder="Search.."
              ref={(ref) => { this.input = ref; }}
            />
            <button className="btn-blue" type="submit">Search</button>
          </label>
        </form>
        <h2>User List</h2>
        <ul className="user-population">
          { this.populateUsers() }
        </ul>
      </section>
    )
  }
}

也试过这个,结果一样

// wrapper.find('input.input-user').simulate('input', { target: { value: 'ni' } });
wrapper.find('input.input-user').simulate('submit', { target: { value: 'ni' } });

这是一个过于复杂的测试,该操作会调度一个事件,然后通过Redux更新状态。

我们正在测试的内容需要分解成几个步骤。

  • 模拟假数据
  • 测试减速器中的动作
  • 酶尚不支持调度事件

https://github.com/airbnb/enzyme/blob/master/docs/future.md

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM