Jest+Enzyme测试React组件(上)

Posted 小洁码很快!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jest+Enzyme测试React组件(上)相关的知识,希望对你有一定的参考价值。

React函数式组件

fb团队推荐使用函数式组件进行开发,但是函数是无状态的, 用class组件不香嘛,自带state状态,为什么要换写法?原因我们就来讲讲。

 

1. hooks是比HOC和render props更优雅的逻辑复用方式

state是一种外部数据。useState得到的状态,对于组件来说是一种外部传入的数据,和props、context没有本质的区别。useState声明的状态,实际由React内核进行维护,传递给函数式组件。

 

hooks时代的函数式组件依然是【外部数据=>view】的纯函数。

Umi Hooks阿里团队开源的hooks方法集(现已升级为ahooks),可以说是hook界的lodash,足以满足日常开发,复杂业务也可自定义hook。

 

2. 函数式组件的心智模型更加“声明式”

现在hooks直接给你一个声明副作用的API,使得生命周期变成了一个"底层概念",无需开发考虑,开发者工作在更高的抽象层次上了。

 

3. 纯函数组件对于开启"并发模式"是必备的条件

React渲染过程本质上是在:根据数据模型(应用状态)来计算出视图内容。

组件纯化以后,开发者编写的组件树其实就是 (应用状态)=>DOM结构的纯函数。

又因为应用状态实际由React内核进行维护,所以React内核可以维护多份数据模型,并发渲染多个版本的组件树。

React开发者只需要编写纯函数,不需要关心如何应对这些并发渲染。

等等,不是要说Jest测试嘛?讲了这么多函数式编程是什么鬼?

因为编写单元测试和你的组件划分、逻辑复用、状态传递有很大关系,如果你的编码不规范、代码耦合度高,比如这样:

 

// antd{  title: '状态',  dataIndex: 'optionStatus',  render: (value: number) => (value: number) => {    if (value === 0) {      return <Tag color="red">{PROPOSAL_RULE_ENABLE[0].label}</Tag>    }    if (value === 1) {      return <Tag color="blue">{PROPOSAL_RULE_ENABLE[1].label}</Tag>    }    return <Tag color="blue">{PROPOSAL_RULE_ENABLE[2].label}</Tag>  },  width: 120,},

(左右滑动查看完整代码)

在编写测试语句的时候if条件分支很容易测不全,而且逻辑写在render方法里面,需要在table里mock进去不同的数据,也增加了编码工作。

打个比方:写代码战斗力为80,写单元测试战斗值120+, 首先要明白自己的代码逻辑,才能写出好的测试语句。

而且在开发中要有意识地想到后面的测试怎么写,顾头不顾尾很容易返工改代码,当然,你说我测不全无所谓,一把梭哈干到底?

这样也可以啦,只是后面测试可能会多找你谈谈心......

这就引出了第二个问题:如何根据产品原型划分我的组件, 代码结构怎么设计呢?

 

Testing

 

组件划分

 

React+Typescript+Mobx+hooks。

以上是我所在的部门, 日常开发所采用的技术栈, 举个例子:

图片

按照以上产品原型, 拆分功能模块如下:

图片

函数式组件编码开发:​​​​​​​

Overview   Department.tsx //搜索部门组件   helper.ts //增 删 改 查 变更记录 搜索,方法调用    index.tsx //项目骨架   List.tsx //table表格   SearchForm.tsx //上部搜索组件

(左右滑动查看完整代码)

我们在编写代码的时候,对业务模块进行了充分的拆分,每个功能放在单独的文件中,入口文件没有太重的业务代码。

Department可以放在Component文件夹中,helper文件存放页面的调用方法,以及和store的交互,其余组件只是作为页面UI的渲染。

这里涉及到一个拆分粒度的问题,确保每个文件解决某一单一问题,比如数据格式化可以放在tool文件夹里,页面打散之后,单个文件涉及到的代码逻辑不会太重。

在后续测试中,把文件当作一个个函数,只需要输入不同的参数即可测试。

在这里推荐一个我自己创建的软件测试交流群,QQ:642830685,群中会不定期的分享软件测试资源,测试面试题以及测试行业资讯,大家可以在群中积极交流技术,还有大佬为你答疑解惑。

风里雨里,我在群中等你。

以上是关于Jest+Enzyme测试React组件(上)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jest / Enzyme 在 React 中的功能组件内部测试方法

Jest+Enzyme测试React组件(上)

使用 Jest/Enzyme 在 React 功能组件中测试封闭组件

使用 Jest 和 Enzyme 测试使用 Redux 的功能性 React 组件

使用 React Suspense 和 React.lazy 子组件进行 Jest/Enzyme 类组件测试

如何覆盖 react-hooks 组件内的函数测试 - Enzyme/Jest