刚做完前学僧的401-react-clickable-grid,项目本身并不难,但全部实现后的测试却让我有些犯难,newraina做的也并没有携带测试。好不容易参照网上的一篇博文与相应测试工具的文档完成简单的单元测试后,我无意中发现阮一峰老师在他的github上发布的react-testing-demo,刚好可以参照一下大牛的demo,阮老师写的React TodoList也是不错的学习样例哟。我同时结合网上的一些资料,对react的组件测试做一个小小的总结,当然极大部分参照了阮老师的英文README.md哒。
首先,React最重要的测试工具就是official Test Utilities,官方测试工具集,不过它只提供了较为低级的API。因此,出现了很多第三方的测试类库,不过他们大多基于官方测试集开发。测试库Enzyme是众多同类测试库中较为容易掌握的。
Test Utilities提供给用户两种测试选择:
Shallow Rendering: 用来测试虚拟DOM对象
Shallow Rendering就仅仅渲染一层,是不对子组件进行渲染的,返回虚拟DOM对象
|
|
下面我们用一个非常简单的例子来理解一下什么是浅渲染,以及常用到的API:
|
|
当然shallowRender还可以进行扩展,传入props参数给组件,renderer.render(<Component {...props}/>)
。
DOM Rendering: 测试真正的DOM节点
第二种选择就是直接将React的组件渲染成真实的DOM,也就是完全渲染,使用renderIntoDocument
方法。不过使用这个方法需要搭建DOM环境,这里我们采用jsdom:
|
|
我们需要在测试启动的命令行中require这段代码,修改package.json
:
|
|
同样,用测试一条Todo的删除功能的代码来说明问题:
|
|
当然官方还提供了各种寻找node的方法,例如通过class、tag、type等等,详见官方说明.
官方提供的API比较长,我们可以利用react-dom
的findDOMNode
方法。我们也用一个例子来说明,用户点击一条Todo后会有一道线划掉它,表示已经做完:
|
|
这里阮大大说: findDOMNode
方法的最大优点,就是支持复杂的CSS选择器。这是TestUtils
本身不提供的。这里我也提出了自己的疑问,这个差异是如何体现的?querySelector()作为DOM的API,在findDOMNode和TestUtils渲染出来的DOM上操作应该是一致的吧。
在我自己的写的小项目中,我使用了Enzyme,对官方测试库进行了封装。主要提供了三种使用方法:
Shallow Rendering - shallow
它与官方测试库的浅渲染类似,只会渲染一层组件,shallow(node[, options]) => ReactWrapper
注意:.html()
会将组件完全渲染后返回字符串,可以使用.shallow()
再渲染子组件,.find()
只支持简单选择器,.type()
可返回组件的类型,.text()
返回文本内容。
Full DOM Rendering - mount
全部渲染,enzyme已经利用jsdom模拟出一个浏览器的js环境。
Static Rendered Markup - render
全部渲染,render方法将React组件渲染成静态的HTML字符串,然后分析这段HTML代码的结构,返回一个对象。主要是采用了第三方HTML解析库Cheerio。
最后,说一个小插曲吧,正当我兴高采烈地写着这篇博文时,阮一峰大大也发布将README.md用中文进行整理发到了他的博客上 - React 测试入门教程,又是一篇好文!还以为阮大大只是推推github不发文呢,小忧伤,哈哈~~