Jest测试React组件入门

一、引入

  • 本文介绍一个基于enzyme测试React的例子
import { shallow, mount, render } from 'enzyme'

二、介绍

  • shallow render — 仅渲染一层,不渲染子组件,他返回虚拟 DOM 对象,不能进行 DOM 操作(一般用于Item)
  • full dom render — 真正的 DOM 渲染,可以操作 DOM ,很常用(一般用于Input、List)

三、演示(以shallow render为例)

1.下载demo
demo下载地址

2.配置

  • 克隆代码
  • npm i 安装依赖
  • 安装测试所需要的包npm i react-test-renderer enzyme enzyme-adapter-react-16 jest -D

3.根目录下新建.babelrc文件,文件内容为:

{
    "presets":[
        "es2015",
        "react"
    ]
}
  • 此内容本为webpack.config.jsmodulerules 字段 babel 的编译配置。因为Jest测试需要调用.babelrc文件,因此需要配置

4.在要测试的组件目录下新建__test__文件夹,并在文件夹里新建**.test.jsx(零配置的前提下),并添加测试

  • 例如,为了测试item组件,新建src/item/__test__/item.test.jsx,文件内容为:
import React from 'react'
import Enzyme,{shallow} from 'enzyme'     //本例子只以shallow(浅渲染,只渲染父组件)为例
import Item from '../../item'     //导入需测试的组件

import Adapter from 'enzyme-adapter-react-16'; //适应React-16
Enzyme.configure({ adapter: new Adapter() })    //适应React-16,初始化

test('Item',()=>{
    const item = shallow(<Item item="test"/>); //传入数据'item'

    expect(item.text()).toBe('test')
    expect(item.hasClass('item')).toBe(true)
    expect(item.hasClass('item-selected')).toBe(false)
})

test('Item Clicked',()=>{
    const item = shallow(<Item item="test" />)

    item.simulate('click')
    expect(item.hasClass('item')).toBe(true)
    expect(item.hasClass('item-selected')).toBe(true)
})

测试(必定出错,请往下看):

出错示例

5.以上出错是因为没屏蔽CSS,因为在index.jsximport './index.css',CSS并不是以模块的形式引入的。所以我们需要自定义Mocks屏蔽CSS,具体如下:

  • 在根目录下新建__mocks__并新建styleMock.js,内容为:
module.exports = {}
  • package.json中添加字段
"scripts":{...
},
"jest": {
    "moduleNameMapper": {
      "\\.css$": "<rootDir>/__mocks__/styleMock.js"
    }
  },

测试:

成功示例

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • This project was bootstrapped with Create React App. Belo...
    unspecx阅读 5,240评论 0 2
  • npm init生成package.json文件. 安装各种需要的依赖: npm install --save r...
    萘小蒽阅读 9,920评论 1 3
  • 自己最近的项目是基于react的,于是读了一遍react的文档,做了一些记录(除了REFERENCE部分还没开始读...
    潘逸飞阅读 3,509评论 1 10
  • 不知道从什么时候开始喜欢古老的东西,古城古镇古景古物。小隐于野,大隐于市,小隐大隐之地,湖南的靖港古镇应该是个不错...
    潇萱阅读 472评论 0 3
  • 年少的时候,我一直在想,我的未来是不同的,我是这万千人中独特的一个。 不过,现在不同了,我活的吃力。 一切都无法应...
    西瓜米阅读 297评论 0 0