react 单元测试 (jest+enzyme)
为什么要做单元测试
作为一个前端工程师,我是很想去谢单元测试的,因为每天的需求很多,还要去编写测试代码,感觉时间都不够用了。
不过最近开发了一个比较复杂的项目,让我感觉一旦项目大了、复杂了,而且还是多人维护一个应用,编写测试代码,
还是很有必要的。毕竟这样做完之后,后边的维护会轻松很多。
单元测试
测试代码的最小单元,一个函数就是一个单元
测试工具
主要用到的测试工具是 jest 和 enzyme
jest 、 enzyme 介绍
jest 是 facebook 发布的一个开源的,基于 jasmine 框架的 javascript 单元测试工具它提供了很多有效的功能,
包含了内置的测试环境的 DOM API 来操作 Dom、断言库、mock 等功能,并且 jest 是 react 的官网上面推荐
的工具。
enzyme 是 Airbnb 开源的 react 测试类库,提供了一套简洁强大的 api ,可以通过 jq 的风格进行 dom 处理,
还可以引用一些其他的 dom 操作库。
react 单元测试的搭建
react 项目是基于 webpack + babel 来进行构建的。
安装 npm 包
首先需要添加一些 jest + enzyme 的 npm 包
yarn add jest enzyme babel-jest regenerator-runtime react-test-renderer
enzyme 需要安装对应的 react 的 adapter 版本
yarn add enzyme-adapter-react-16
配置文件
1、package.json
"scripts": {
"test": "jest --colors --coverage"
},
添加颜色和现实覆盖率
.babelrc 文件
"env": { // 单元测试下配置
"test": {
"presets": [
"react",
"react-optimize",
[
"env",
{
"modules": "commonjs", // 主要是添加这个
"debug": true,
"useBuiltIns": false,
"targets": {
"browsers": "defaults"
}
}
],
"stage-0"
]
}
}
因为测试环境的在 babel 中的配置 dev 为 test。
所以这里需要特殊配置,modules 的形式是 commonjs
添加jest配置文件jest.config
module.exports = {
roots: ['<rootDir>/__test__/', '<rootDir>/src/'], // 测试的目录
modulePaths: ['<rootDir>'],
coveragePathIgnorePatterns: ['/node_modules/', '/tests/setup.js'], //忽略统计覆盖率的文件
// bail: true,
// testRegex: '', // 后缀名称
// testPathIgnorePatterns: 'est', // 忽略路径
// moduleNameMapper: { // 与测试无关的资源文件同意mock 掉,这样在import 的时候就不会真的引入这些文件
// '^import?': '<rootDir>/build/jestImportMock.js',
// '\\.(css|less|gif|jpg|jpeg|png)$': '<rootDir>/build/jestStyleMock.js',
// },
};
jest 详解
1、简单测试结构
function sum(a,b){
return a+b;
}
it('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
2、异步的测试结构
async function sum (a,b){
return a+b;
}
it('adds 1 + 2 to equal 3',async () => {
const total = await sum(1,2)
expect(total).toBe(3);
});
3、Mock Function 结构
function forEach(items, callback) {
for (let index = 0; index < items.length; index++) {
callback(items[index]);
}
}
const mockCallback = jest.fn(x => 42 + x);
forEach([0, 1], mockCallback);
// 可以 mockCallback.mock 访问 mockCallback 状态
1、jest.fn 用来创建一个 mock function
2、mockCallback.mock 可以访问 mock function 的状态
mock 的属性:
calls : 调用的参数数组,保存了每次调用的入参
calls.length : 调用次数
calls[0][0] : 第一次调用的时候的第一个参数
results:调用的结果数组
results[0].value : 第一次调用的返回结果
执行 mock function
const myMock = jest.fn();
console.log(myMock());
// > undefined myMock
.mockReturnValueOnce(10)
.mockReturnValueOnce('x')
.mockReturnValue(true); console.log(myMock(), myMock(), myMock(), myMock());
//10 x true
1、用 mockRetrunValueOnce(value) 来预先设置函数的返回值
2、mymock() 返回预先设置的值
异步请求的数据模拟
let fetch = {
get:() =>{}
}
jest.mock(fetch)
fetch.get.mockResolvedValue({data:{},status:0})
fetch.get(url,options)
// {data:{},status:0}
4、常用全局方法
describe(message,()=>{}) : 创建块
it(message,()=>{}) : 测试单元
5、ecpect 常用方法
expect(value) : 注入测试单元
expect.extend({}) : 拓展 expect 方法
expect.extend({
toBeBetween(received, arg1, arg2) {
const min = arg1;
const max = arg2;
if (received > min && received < max) {
return {
message: '',
pass: true,
};
}
return {
message: `received is between in ${min} - ${max}`,
pass: true,
};
},
});
expect(99).toBeBetween(1,100)
expect.anything() : 返回除了 null 和 undefined 意外的任何类型数据
expect.any(Number/String) : 任意 数字/字符串
expect.assertions(num) : 确定在块中调用几次异步
toBe(value) : 等于
toHaveBeenCalled() : 确定函数调用
toHaveBeenCalledTime(number) : 确定被调用的次数
toHaveBeenCalledWith(arg1,arg2) :取保调用的函数的值
toHaveBeenNthCalledWith(num,arg2) : 确保第几个参数
toHaveRetruned() :确保有返回值
toHave[:Nth]RetrunedWith([:num,]arg) : 确保某一个有返回值
toContain(item) : 数组中是否包含
toMatch(regex) :正则表达式
enzyme
enzyme 一共有四个大的 api ( shallow 、mount 、render 、selectors )。
通过这四个 api 可以对 react 组件进行操作。
我们可以通过类似于 jquery 的操作来进行 test 。
react 单元测试 (jest+enzyme)的更多相关文章
- react: typescript jest && enzyme
Install Jest 1.install jest dependencies jest @types/jest ts-jest -D 2.jest.config.js module.exports ...
- 搭建 Jest+ Enzyme 测试环境
1.为什么要使用单元测试工具? 因为代码之间的相互调用关系,又希望测试过程单元相互独立,又能正常运行,这就需要我们对被测函数的依赖函数和环境进行mock,在测试数据输入.测试执行和测试结果检查方面存在 ...
- react typescript jest config (一)
1. initialize project create a folder project Now we'll turn this folder into an npm package. npm in ...
- React单元测试——十八般兵器齐上阵,环境构建篇
一个完整.优秀的项目往往离不开单元测试的环节,就 github 上的主流前端项目而言,基本都有相应的单元测试模块. 就 React 的项目来说,一套完整的单元测试能在在后续迭代更新中回归错误时候给与警 ...
- 如何为我的VUE项目编写高效的单元测试--Jest
Unit Testing(单元测试)--Jest 一个完整的测试程序通常由几种不同的测试组合而成,比如end to end(E2E)测试,有时还包括整体测试.简要测试和单元测试.这里要介绍的是Vue中 ...
- jest enzyme unit test react
1. 测试类型 单元测试:指的是以原件的单元为单位,对软件进行测试.单元可以是一个函数,也可以是一个模块或一个组件,基本特征就是只要输入不变,必定返回同样的输出.一个软件越容易些单元测试,就表明它的模 ...
- Jest+Enzyme React js/typescript测试环境配置案例
本文案例github:https://github.com/axel10/react-jest-typescript-demo 配置jest的react测试环境时我们可以参考官方的配置教程: http ...
- [React] Use Jest's Snapshot Testing Feature
Often when testing, you use the actual result to create your assertion and have to manually update i ...
- 单元测试jest部署
引入jest需安装的基础插件: 基础插件 @babel/core 编译工具核心模块包 @babel/preset-env 编译工具,支持es2015特性的编译打包工具包 babel-jest 对.js ...
随机推荐
- 240 Search a 2D Matrix II 搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵中的一个目标值.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列.例如,考虑下面的矩阵:[ [1, 4, 7 ...
- 选择语言之switch case
程序语言-选择语言之switch case 多选一,类似if else if else if else 模版: Switch(选择条件) { Case(条件一)//相当于if Conso ...
- A8ERP配送管理系统
- hibernate关联关系查询
关联关系 一对一 A中包含B的对象,B中包含A的对象 一对多 A中包含B的集合,B中包含A的对象 多对多 A中包含B的集合,B中包含A的集合 1,一对多配置 一名老师可以对应多名学生 2,模型类 老师 ...
- duilib属性
原文转载自:http://blog.csdn.net/lixiang987654321/article/details/45008441 这里我想讲解一下duilib中的一些属性的理解,当然这是一篇永 ...
- Apache ab使用指南
Apache ab使用图例: 其中比较重要的两个指标要特别注意: Requests per second:表示平均每秒事务数,相当于LR的TPS Time per second:用户请求平均响应时间和 ...
- Selenium示例集锦--常见元素识别方法、下拉框、文本域及富文本框、鼠标操作、一组元素定位、弹窗、多窗口处理、JS、frame、文件上传和下载
元素定位及其他操作 0.常见的识别元素的方法是什么? driver.find_element_by_id() driver.find_element_by_name() driver.find_ele ...
- RocketMQ学习笔记(13)----RocketMQ的Consumer消息重试
1. 概念 Producer端重试: 生产者端的消息失败,也就是Producer往MQ上发消息没有发送成功,比如网络抖动导致生产者发送消息到MQ失败. 这种消息失败重试我们可以手动设置发送失败重试的次 ...
- 当From窗体中数据变化时,使用代码获取数据库中的数据然后加入combobox中并且从数据库中取得最后的结果
private void FormLug_Load(object sender, EventArgs e) { FieldListLug.Clear();//字段清除 DI = double.Pars ...
- gym101343J. Husam and the Broken Present 2 (状压DP)
题意:给定n个串 每个串长度不超过100 找到一个新串 使得这n个串都是它的字串 输出这个新串的最小长度 题解:n是15 n的阶乘的复杂度肯定不行 就想到了2的15次方的复杂度 想到了状压但是不知道怎 ...