使用Enzyme和Jest 测试React组件(上)

栏目: IOS · Android · 发布时间: 6年前

内容简介:— wikipediaAirbnb开源的 React 测试类库 Enzyme 提供了一套简洁强大的 API,并通过 jQuery 风格的方式进行DOM 处理,开发体验十分友好。不仅在开源社区有超高人气,同时也获得了React 官方的推荐。
使用Enzyme和Jest 测试React组件(上)

Enzyme 是一类大分子生物催化剂。酶能加快化学反应的速度(即具有催化作用)

— wikipedia

Airbnb开源的 React 测试类库 Enzyme 提供了一套简洁强大的 API,并通过 jQuery 风格的方式进行DOM 处理,开发体验十分友好。不仅在开源社区有超高人气,同时也获得了React 官方的推荐。

—Airbnb.io

Jest 我们上一篇已经说过了,今天主角是Enzyme , 如字面意思,Enzyme 是酶、有催化作用。那么在React 组件测试中和Jest 产生了什么化学:ski:反应呢?

2 课前准备

2.1 项目

这里我们使用 create-react-app 初始化一个项目

npm i -g create-react-app
npx create-react-app enzyme-in-action --use-npm
cd enzyme-in-action
npm start 
复制代码

会自动打开浏览器将看到这个页面。

使用Enzyme和Jest 测试React组件(上)
这个是 create-react-app 起手式,如果不太了解建议 Create a New React App – React

了解下。

2.2 准备jest 和 enzyme配置

在::package.json:: 中修改 scripts

- "test": "react-scripts test",
+ "test": "jest",
复制代码

在::package.json:: 中增加 jest 配置

"jest": {
  "transform": {
    "^.+\\.jsx?$": "babel-jest",
    "^.+\\.svg$": "jest-svg-transformer"
  },
  "moduleNameMapper": {
    "\\.(css|less)$": "identity-obj-proxy"
  }
}
复制代码

安装依赖包

npm i -D jest babel-jest babel-core babel-preset-env babel-preset-react enzyme enzyme-adapter-react-16 jest-svg-transformer identity-obj-proxy
复制代码

jest-svg-transformeridentity-obj-proxy 是为了保证 jsx 文件中的

import logo from './logo.svg' import './App.css' 被正常渲染出来

2.3 背景知识

  1. Enzyme 它提供三种测试方法:
    • ::shallow::
    • ::render::
    • ::mount::
  2. wrapper wrapper是enzyme包装好的类,以供api使用
  3. shallow 在单元测试的过程中,浅渲染将一个组件渲染成虚拟DOM对象,并不会渲染其内部的子组件,也不是真正完整的React Render,无法与子组件互动。

3 起手式

修改 create-react-app 为我们生成好的::src/App.test.js::

import React from 'react'
import App from './App'
import { configure, shallow } from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'

configure({ adapter: new Adapter() })

describe(`<App />`, () => {
  it('should render App', () => {
    const warpper = shallow(<App />)
    console.log(warpper.debug())
  })
})
复制代码

npm run test

使用Enzyme和Jest 测试React组件(上)
warpper.debug() 已经输出渲染的Dom,这个 warpper

用来我们后面,用jQuery语法来测试。

4 find 测试节点

在::app.js::中增加

<img src={logo} className="App-logo" alt="logo" />
+ <h1>Welcome to React</h1>
  <p>
复制代码

现在我们来正式写单测 ::app.test.js::

describe(`测试<App />`, () => {
  const warpper = shallow(<App />)

  it('1. 包含一个p标签', () => {
    expect(warpper.find('p').length).toBe(1)
  })

  it('2. class为"App-link"的元素能正常被渲染', () => {
    expect(warpper.find('.App-link').exists()).toBeTruthy()
  })

  it('3. header的class为“App-header”', () => {
    expect(warpper.find('header').hasClass('App-header')).toBeTruthy()
  })

  it('4. header有3个子元素', () => {
    expect(warpper.find('header').children().length).toBe(4)
  })

	it('5. 测试H1标签的内容', () => {
    expect(warpper.find('h1').text()).toBe('Welcome to React')
  })

  it('6. 测试image标签class', () => {
    expect(warpper.find({ alt: 'logo' }).hasClass('App-logo')).toBeTruthy()
  })
})
复制代码

写过jQuery 的同学有没有很熟悉?这里不过多解释。

这里推荐一个VsCode插件Jest 在每个单元测试前面会有一个icon标示当前是否过测。

使用Enzyme和Jest 测试React组件(上)

5 使用 snapshots 测试组件

按照 find 的方法测试组件,需要写多少单元测试,jest 为我们提供了一种快照的方式,来对比组件的变化。 安装依赖:

npm i -D enzyme-to-json
复制代码

在::app.test.js::中增加测试

import Adapter from 'enzyme-adapter-react-16'
+ import toJson from 'enzyme-to-json'
复制代码
describe(`测试<App /> snapshots`, () => {
  const tree = shallow(<App />)

  it('1. 匹配快照', () => {
    expect(toJson(tree)).toMatchSnapshot()
  })
})
复制代码

npm run test 在命令行中会有

› 1 snapshot written.
Snapshot Summary
 › 1 snapshot written from 1 test suite.
复制代码
使用Enzyme和Jest 测试React组件(上)

这时候我们看工程目录

使用Enzyme和Jest 测试React组件(上)
增加了 src/__snapshots__/App.test.js.snap 这个就是jest的快照。jest原生的快照比较复杂, enzyme-to-json

为我们做了简化。

第一次写toMatchSnapshot 的时候,被创建。当我们修改测试的时候它被更新。

我们来尝试修改一下react 组件 看会有什么事情发生

修改::app.js::

- <h1>Welcome to React</h1>
+ <h1>Welcome to React Jest Enzyme</h1>
复制代码

npm run test 在命令行中会有 错误信息,告诉你哪里发生了变化

使用Enzyme和Jest 测试React组件(上)

tips: 更新快照的命令: jest --updateSnapshot 在watch 的情况下 按u 更新快照,如果你用的是vscode 那么修改组件的时候会提醒你是否更新。

使用Enzyme和Jest 测试React组件(上)

6 测试含有“props”的组件

首先增加一个 <Link> 组件 ::App.js::

export class Link extends PureComponent {
  render() {
    const { hide, address } = this.props
    return hide ? null : <a href={address}>Click</a>
  }
}
复制代码

在::app.test.js::中增加测试

describe(`测试<Link />`, () => {
  it('1. 测试link组件', () => {
    const warpper = shallow(<Link address="https://www.google.com" />)
    expect(warpper.props().href).toBe('https://www.google.com')
  })

  it('2. 测试设置Link props', () => {
    const warpper = shallow(<Link />)
    expect(warpper.find('a').length).toBe(1)
    warpper.setProps({ hide: true })
    expect(warpper.find('a').length).toBe(0)
  })
})
复制代码
  1. warpper.props() 的结果为
{ href: 'https://www.google.com', children: 'Click' }
复制代码
  1. 在case : 2. 测试设置Link props 中用 warpper.setProps() 动态的给 <Link /> 设置参数验证组件是否被正常渲染

X 未完待续…

后面还有 :如何测试state ,生命周期,等等。 Jest 没写尽兴,再整理一篇进阶的文章,有小伙伴不清楚什么是集成测试和单元测试,后面整理一篇cypress相关的文章。 秋日的北京周末,开始起雾霾,周末陪周老师备考高级教师资格证,才能坐电脑前写这么长时间。

2010年底来北京,一晃8年过去了。刚来北京的时候无知但无畏,到现在无味且无为。纪念一下这个心情复杂的时刻。望以后无论在什么地方,坦然以对。

— 今天的豆瓣日记

来自豆友分享的专辑:minidisc: 空中 ベスト・オブ (豆瓣) 灰常好听,虽然夜已深,还是元气满满,开始写第三篇。

技术能力有限,有什么不妥之处请指正。 有什么关于前端方面有疑惑 的方面,可以留言交流,会放到后面的写作计划中。


以上所述就是小编给大家介绍的《使用Enzyme和Jest 测试React组件(上)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

零基础学PHP

零基础学PHP

马忠超 / 2008-3 / 56.00元

《零基础学PHP》主要内容:PHP是一种运行于服务器端并完全跨平台的嵌入式脚本编程语言,是目前开发各类Web应用的主流语言之一。PHP因其功能强大、易学易用、可扩展性强、运行速度快和良好的开放性,而成为网站开发者的首选工具,其较高的开发效率,也给开发人员在编写Web应用程序时带来极大的便利。一起来看看 《零基础学PHP》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具