开始使用Enzyme和Jest测试React组件

时间:2017-06-30 15:07:13

标签: javascript unit-testing reactjs jestjs enzyme

不幸的是,在我工作的地方,我们不对React Components进行单元测试。由于我对这个行业也很陌生,所以我没有经验为软件编写单元测试。这让我在尝试独立学习时陷入了一种奇怪的困境,因为我在网上看到的例子要么解释得不好,要么就不适合初学者。我最近检查了用酶和Jest测试React组件,并认为这种组合看起来很有希望。

我的目标是:我想找出正确的方法来测试React道具是否从父组件到子组件一直正常工作。我正在使用Jest和Enzyme,因此解决方案应该使用这两个模块的最佳实践。

为简单起见,我想围绕两个示例组件提出这个问题。而不是在现实世界中你永远看不到的名字,让我们假装这些组件在串联使用时会产生一个用户列表到屏幕上。组件将命名为:

  1. UserList(父母)
  2. UserListItem(The Child)
  3. 这是 UserList React组件。为了有希望尝试简化这个例子,我只是将要传递给子节点的数据放在本地状态。我们假设这个数据总是一个对象数组。

    import React, { Component } from 'react'
    import UserListItem from './user-list-item'
    
    export default class UserList extends Component {
      constructor(props) {
        super(props)
    
        this.state = {
          users: [
            {
              userName: 'max',
              age: 24
            },
            {
              userName: 'susan',
              age: 28
            }
          ]
        }
      }
    
      renderUsers = (list) => {
        return this.state.users.map(user => <UserListItem key={user.userName} user={user} />)
      }
    
      render() {
        return (
          <ul>
            {this.renderUsers()}
          </ul>
        )
      }
    }
    

    现在,这是子组件 UserListItem

    import React, { Component } from 'react'
    
    const UserListItem = ({ user }) => {
      return (
        <li>
          <div>
            User: {user.userName}
          </div>
          <div>
            Age: {user.age}
          </div>
        </li>
      )
    }
    
    export default UserListItem
    

    通过在线阅读各种教程,我发现通过Enzyme的浅层渲染是首选方式。我已经明白它是如何工作的,但我真正想要的是对道具进行端到端的彻底测试。

    此外,仅检查React组件是否正在传递特定的道具名称是否足够?或者我们是否还需要创建一些带有虚拟数据的伪数组来提供给子组件?

1 个答案:

答案 0 :(得分:3)

对于您当前的组件,我会编写一个测试,以确保正确呈现状态中的元素,例如:

it('should render two UserListItems', () => {
  const cmp = shallow(<UserList />);

  expect(cmp.find(UserList).length).toBe(2);
})

我还会测试发送给孩子的数据是否正确。在这种情况下,users的{​​{1}}状态应显示在每个孩子UserList的道具中。

UserListItem

对于UserListItem组件,我会测试是否正确呈现了名称和年龄。

it('should send the correct data', () => {
  const user = { userName: 'test', age: 22 };
  const cmp = shallow(<UserList />);
  cmp.setState({ users: [user] });

  expect(cmp.find(UserListItem).props().user).toBe(user);
})