热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Enzyme测试reactreduxapp(接上一篇)

使用Enzyme测试react-redux-app(接上一篇)使用enzyme+jest可以很方便的来测试我们的react应用测试需要关注哪些方面页面的结构的测试(一般是去判断do

使用 Enzyme 测试 react-redux-app(接上一篇)

使用 enzyme+jest 可以很方便的来测试我们的 react 应用

测试需要关注哪些方面

  • 页面的结构的测试(一般是去 判断 dom 结构对不对)
  • 样式的测试(这个比较复杂,可能需要我们去截图对比,简单点的做法,就直接对比样式代码是否有变更,这个只对 inline-style 有效)
  • 交互的测试( 测试一些交互能否正常被触发)

安装依赖

yarn add -D enzyme enzyme-adapter-react-16 @types/enzyme @types/enzyme-adapter-react-16

设置启动文件

按照 enzyme 文档,测试前是需要做一些准备工作的, 所以我们在根目录下添加test.setup.ts

// test.setup.ts
import { configure } from 'enzyme'
import * as Adapter from 'enzyme-adapter-react-16'
configure({ adapter: new Adapter() })

同时修改jest.config.js文件

module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
setupTestFrameworkScriptFile: '/test.setup.ts'
}

模拟浏览器环境

react 应用运行的时候是在浏览器环境,但是我们测试的时候是在 node 环境,所以需要我们模拟出浏览器环境才能正确的运行测试。之前的做法是在无头浏览器中跑测试代码,但现在我们有一个更好的、更轻量的方法,就是使用jsdom

安装 jsdom

yarn add -D jsdom @types/jsdom
# 顺带安装一下requestAnimation的模拟,react需要
yarn add -D raf

修改test.setup.ts

import 'raf/polyfill'
import { configure } from 'enzyme'
import * as Adapter from 'enzyme-adapter-react-16'
import * as jsdom from 'jsdom'
const { window } = new jsdom.JSDOM('')
global.window = window
global.document = window.document
configure({ adapter: new Adapter() })

编写测试

测试简单的组件

我们先写一个测试文件测一个简单的组件test/BtnBack.test.ts

/**
* 返回按钮
*/
import * as React from 'react'
import { Button } from 'antd'
import { ButtonProps } from 'antd/lib/button'
import { win } from '../../util'
const BtnBack: React.SFC = props => (

)
export default BtnBack

import * as React from 'react'
import { shallow } from 'enzyme'
import BtnBack from '../../src/components/BtnBack'
import { Button } from 'antd'
test('', () => {
const wrapper = shallow()
// 这部分是 结构测试
const props = wrapper.find(Button).props()
expect(props.children).toEqual('返回')
// 这部分是 交互测试
global.window = {
history: {
back: jest.fn()
}
}
wrapper.find(Button).simulate('click')
expect(global.window.history.back).toBeCalled()
})

done! 是不是很简单。

测试 connected 组件

测试 connected 组件有两种方法。

  • 一种是使用dive方法,dive 能剥离 第一层组件,返回 connected 组件里第一个非 dom 的 child-node,也就是我们自己写的组件,然后就像测一个简单组件一样去测 这个组件。当然,测试的时候需要模拟出 connected 产生的一些 props。
  • 另一种就是模拟出 redux-store,我用的是这种

安装 mock-store

yarn add -D redux-mock-store @types/redux-mock-store

编写测试

import * as React from 'react'
import Selector from '../../src/components/Selector'
import configureStore from 'redux-mock-store'
import { mount } from 'enzyme'
import { Select } from 'antd'
const middlewares = []
const mockStore = configureStore(middlewares)
const initState = {
dataList: [
{
value: 1,
desc: '1'
},
{
value: 2,
desc: '2'
}
]
}
const store = mockStore(initState)
test('loadActin: Function, dataSouce: any', () => {
let count = 0
const loadAction = () => {
count++
return {
type: 'TEST'
}
}
const wrapper = mount(
loadAction={loadAction}
statePicker={state => state.dataList}
store={store}
>
{(dataSource, Option) => {
return dataSource.map((e: any, i: number) => (

))
}}

)
// action 被调用
expect(count).toBe(1)
// 渲染出正确的option 数量
const opts = wrapper.find(Select).prop('children') as any[]
expect(opts.length).toBe(2)
}

done! 是不是也很简单。

其他例子

大部分测试情况,都能在 enzyme 的文档中找到例子,我这边只是简单的介绍一下,enzyme 如何使用。

测试覆盖率

测试覆盖率是评价测试一个很重要的指标,我们可以通过yarn jest --coverage生成测试报告,查看代码中没有被测试到的分支,一点点的提高测试覆盖率

最后

可能大部分项目碍于各种情况,时间不够,需求变化太快等等,放弃编写测试,全部交给测试人员去测。但是,写不写测试是一回事,会不会写测试是另一会事。
希望各位在这又收获了一点小知识。:)


推荐阅读
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • 在分析和解决 Keepalived VIP 漂移故障的过程中,我们发现主备节点配置如下:主节点 IP 为 172.16.30.31,备份节点 IP 为 172.16.30.32,虚拟 IP 为 172.16.30.10。故障表现为监控系统显示 Keepalived 主节点状态异常,导致 VIP 漂移到备份节点。通过详细检查配置文件和日志,我们发现主节点上的 Keepalived 进程未能正常运行,最终通过优化配置和重启服务解决了该问题。此外,我们还增加了健康检查机制,以提高系统的稳定性和可靠性。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • Vue应用预渲染技术详解与实践 ... [详细]
  • 深入解析:React与Webpack配置进阶指南(第二部分)
    在本篇进阶指南的第二部分中,我们将继续探讨 React 与 Webpack 的高级配置技巧。通过实际案例,我们将展示如何使用 React 和 Webpack 构建一个简单的 Todo 应用程序,具体包括 `TodoApp.js` 文件中的代码实现,如导入 React 和自定义组件 `TodoList`。此外,我们还将深入讲解 Webpack 配置文件的优化方法,以提升开发效率和应用性能。 ... [详细]
  • 在深入研究 React 项目的过程中,特别是在探索 react-router 源码时,我发现了其中蕴含的中间件概念。这激发了我对中间件的进一步思考与整理。本文将详细探讨 Redux 中间件的原理及其在实际项目中的应用,帮助读者更好地理解和使用这一强大工具。通过具体示例和代码解析,我们将揭示中间件如何提升应用的状态管理和异步操作处理能力。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 题目要求维护一个数列,并支持两种操作:一是查询操作,语法为QL,用于查询数列末尾L个数中的最大值;二是更新操作,用于修改数列中的某个元素。本文通过ST表(Sparse Table)优化查询效率,确保在O(1)时间内完成查询,同时保持较低的预处理时间复杂度。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有