基于React的Alita框架的jest用法
使用 alita/test 测试
简介
在前端开发的时候,可能会写到很多组件,将这多个组件进行封装已做于后期业务的开发。再将这些组件开源供其他开发人员使用,逐渐发现会出现这样那样的 Bug ,这个时候就需要写测试,测试每个已经开发的组件,是否完善。
本次测试是在 alita 框架的基础上,进行测试。
环境的搭建
1、创建 alita 项目
命令: yarn create alita
项目名
2、切换到项目目录,安装依赖
命令:yarn install
3、下载 alita/test 依赖包
命令:yarn add @umijs/test @alita/test --dev
4、配置 package.json 文件
在 package.json 里面加入两行命令,具体如下
{..."scripts":{..."test": "umi-test","test:coverage": "umi-test --coverage",...}...
}
二、编写测试 demo
1、目录结构
├── src
│ └── pages
│ ├── index
| ├──index.less
| ├──index.tsx
| ├──service.ts
│ └── app.ts
├── node_modules
├── package.json
├── public
......
现在的目录结构如上所示,我们要在 index 文件下,建立一个 index.test.tsx
文件
2、编写 index.test.tsx
文件,证明环境没有问题
test("this is testDemi", () => {expect(2 + 2).toBe(4)
})
在终端输入命令: yarn test
截图如下
三、语法学习
进入关键的知识学习了,前面死板地粘贴复制就可以了,现在要讲知识点了!!!划重点划重点~~~
1、语法小知识
- 只要以
.test.js
||.test.jsx
||.test.ts
||.test.tsx
结尾,jest 自动化测试会自动找到这个文件,不用额外的处理 - test 方法是 jest 提供的一个方法,接受两个参数,第一个参数是描述,第二个参数是函数,执行的判断方法
- expect() 传入的值是函数根据某个例子运行的结果,再利用匹配器进行判断是否一致
2、单元测试术语解析
代码片段:
describe("number test", ()=>{it('1 is true', ()=>{expect(1).toBeTruthy()})test('2 is true',()=>{expect(2).toBeTruthy()})
})
- describe 描述,
decribe
会形成一个作用域 - it 断言
- expect 期望
- test 测试,类似
it
3、挂载 dom 节点
使用 @alita/test 中的 render 方法进行渲染测试
(1)编写 inde 文件夹里面的 index.tex
import React, { FC } from 'react';
import styles from './index.less';const HomePage: FC = () => (<><div className={styles.center}>Hello</div><div>欢迎学习测试</div></>
);export default HomePage;
(2)在 index 文件夹里面创建 index.test.tsx 页面
编写测试内容如下:
// 导入 render 方法
import { render } from '@alita/test'
import React from 'react'
import Page from './index'it('page text', async () => {// 采用 render 方法挂载节点(划重点)const { getByText } = render(<Page></Page>)expect(getByText("欢迎学习测试")).toBeDefined()
})
4、运行测试用例
(1)使用 yarn test
命令
(2)使用 yarn test:coverage
命令
(3)使用 yarn test +测试文件的相对路径
命令
四、知识拓展
1、匹配器
- 在此代码中
expect (2 + 3)
返回一个"期望"的对象 - 在此代码中,
.toBe(4)
就是一个匹配器 toBe
用来测试精确相等,此外还有很多匹配器
//代码直接粘贴复制到.test.tsx结尾的文件或其他测试文件就可以了
test('two plus two is four', () => {expect(2 + 3).toBe(5);
});
(1)针对 number
类型:
//代码直接粘贴复制到.test.tsx结尾的文件或其他测试文件就可以了
// 针对number类型
test("number test", async () => {// 期望值比匹配器大expect(2 + 3).toBeGreaterThan(4.5);expect(2 + 3).toBeGreaterThanOrEqual(5);// 期望值比匹配器小expect(2 + 3).toBeLessThan(6);expect(2 + 3.5).toBeLessThanOrEqual(5.5);expect(2 + 3).toBe(5);expect(2 + 3).toEqual(5);// 浮点数使用toBeCloseTo进行匹配,不用toEqualexpect(0.1 + 0.2).toBeCloseTo(0.3);
})
(2)针对 string
类型
//代码直接粘贴复制到 .test.tsx 结尾的文件或其他测试文件就可以了
// 字符串的匹配
test('string test', async () => {// toMatch 可以使用正则表达式去匹配字符串expect('team').toMatch(/t/);
})
(3)针对数组类型:
//代码直接粘贴复制到.test.tsx结尾的文件或其他测试文件就可以了
// 数组类型匹配
test('Array test', async () => {const shoppingList = ['apple','banana','orange','watermelon','hami',];expect(shoppingList).toContain('orange');expect(new Set(shoppingList)).toContain('banana');
})
(4)针对方法是否执行:
//测试代码在第三点
const onFinish = jest.fn();
const { getByText, getAllByText } = render(//Submit文本按钮上,绑定了一个触发事件<BasicTest onFinish={onFinish} />
);
//点击触发事件
fireEvent.click(getByText('Submit'));
//判断是否触发`onFinish`事件,未触发则报错
expect(onFinish).toBeCalled();
(5)另外还有:
//测试代码在第三点
//判断 dom 节点有 class 的 `radio-wrapper-checked` 属性
expect(getAllByText("男")[1]).toHaveClass("radio-wrapper-checked"
)
//判断 dom 节点存在
expect(getByText("确定")).toBeDefined()
//使用 .not 将匹配器反转
expect(2+3).not.toBe(6);
expect(getByText("取消")).not.toBeDefined()
2、模拟点击事件、 input 输入事件(测试代码在第三点):
//点击'百元'内容的 dom 节点
fireEvent.click(getByText('百元'));
//获取 input 标签输入'10'的容
//getByLabelText 方法是获取 aria-label 属性为 'minLength' 的 input 标签
fireEvent.change(getByLabelText('minLength'), { target: { value: '10' } });
3、测试小代码
(1) index.tsx
代码:
import React, { FC } from 'react';interface FunctionPageProps {onFinish: any;
}
const Function: FC<FunctionPageProps> = ({ onFinish }) => {const [str, setStr] = React.useState("")return (<><div className="testDemo"><input type="text"aria-label="myInput"onChange={(e: any) => { setStr(e.target.value) }}/><button type='button' className="myBut" onClick={() => { console.log(str); onFinish() }}>consoleLog</button><div>您输入的内容是:{str}</div></div></>);
};export default Function;
(2) index.test.tsx
代码:
import { render, fireEvent, waitFor, testA11y } from '@alita/test'
import React from 'react'
import Page from './index'test("function test", async () => {// 赋值一个 jest 的方法const onFinish = jest.fn();const { container, getByText, getByLabelText } = render(<Page onFinish={onFinish} />);await testA11y(container);// 判断内容为 'consoleLog' 的节点存在expect(getByText('consoleLog')).toBeDefined();// 判断内容为 'consoleLog' 的节点 class 属性含有 'myBut'expect(getByText('consoleLog')).toHaveClass('myBut');// 判断内容为'consoleLog' 的节点 class 属性不含有 'But'expect(getByText('consoleLog')).not.toHaveClass('But');// 获取 dom 树里面的 input 标签const input: any = getByLabelText('myInput')// 修改 input 标签里面的 value 值fireEvent.change(input, { target: { value: '函数测试' } })await waitFor(() => {expect(getByText('您输入的内容是:函数测试'))})// 点击内容为 'consoleLog' 的按钮fireEvent.click(getByText('consoleLog'))// 等待响应await waitFor(() => {// 判断 onFinish 方法执行了一次expect(onFinish).toBeCalled()})
})
五、 最后说一下
- 所有测试代码存放在:https://github.com/linjyuan/studyTest
- 匹配器可参考jest官方文档:https://www.jestjs.cn/docs/using-matchers
基于React的Alita框架的jest用法相关推荐
- 基于React开发范式的思考:写在Lesx发布之际
例子:lesx-example webpack loader: lesx-loader 一些背景 现在前端框架已经呈现出React.Angular.Vue三足鼎立的局势,对于三者的对比以及技术选型的思 ...
- 基于Ant Design UI框架的React项目
概述 这款基于React开发的UI框架,界面非常简洁美观,在这篇文章中我主要为大家介绍一下如何用Ant开始搭建React项目 详细 代码下载:http://www.demodashi.com/demo ...
- Next.js提供了基于React的简单通用JavaScript框架
新的通用JavaScript框架Next.js目前已经开源了,它为基于React和服务器的Web应用提供了一个新的可选方案. \\ 来自Zeit的团队在React的基础和组件模型上构建了Next.js ...
- 从零开始搭建一套完整的基于 React 框架的 H5 项目「下载即用、收藏不亏」
最近需要新开一个基于 React 移动端的项目.由于网上完整的 H5 初始化项目比较少,所以在此总结一下如何从 0-1 开发一套基于 React 框架的 H5 初始化项目,下载就可以直接进行开发,欢迎 ...
- 开发html5单页用什么框架,GitHub - mmcai/single-page-react-h5: 基于React框架的单页活动框架,可以基于此代码上进行相关的H5活动等相关内容的开发...
single-page-react-h5 基于React的H5活动页面脚手架,助力你在1小时就可以完成一个H5活动页面,这里已经帮您做了如下几个基本事情 页面缩放,基于宽度为750px的视觉稿,当然您 ...
- 基于 react, redux 最佳实践构建的 2048
前段时间 React license 的问题闹的沸沸扬扬,搞得 React 社区人心惶惶,好在最终 React 团队听取了社区意见把 license 换成了 MIT.不管 React license ...
- 从零搭建React全家桶框架教程
从零搭建React全家桶框架教程 源码地址:https://github.com/brickspert/react-family 欢迎star 提问反馈:blog 原文地址:https://githu ...
- React Native移动框架功能研究
React Native移动框架功能研究 此篇只研究React Native框架的功能. 一.React Natvie是什么 React Native是使用React(或者说JS)来开发原生APP的框 ...
- 实例讲解基于 React+Redux 的前端开发流程
前言:在当下的前端界,react 和 redux 发展得如火如荼,react 在 github 的 star 数达 42000 +,超过了 jquery 的 39000+,也即将超过前几年比较火的an ...
最新文章
- 关于微软研究院(谢幸、郑宇研究员主导的)“智能城市”“智能生活”研究的一个归纳...
- Spring JPA 开启原生sql打印
- domino升级-602-651-851
- Matlab的不同进制转换
- 数据集成之主数据管理(转载整理)
- linux 网卡 巨帧,Linux Kernel e1000e驱动巨型帧处理绕过安全检查漏洞
- Netweaver里某个software component和C4C的版本
- c#+web与php,将Web服务客户端从c#转换为php
- c#分页读取GB文本文件
- js字符串转换为json对象JSON.parse()及将json对象转为json字符串JSON.stringify()
- 4.MySQL优化---多表查询优化
- 全网最全 Chrome浏览器插件推荐大全 持续更新中
- 关于对话机器人,你需要了解这些技术
- 全拼到缩写月份单词python_月份的英文缩写及全名
- helm charts 入门指南
- re.compile(r'xxx')中的r是什么意思
- 人工智能方向毕业设计_人工智能时代,理工科专业的毕业设计都被安排了
- w7计算机删除图标不见了怎么办,win7小电脑图标不见了怎么办
- Poisoning the Unlabeled Dataset of Semi-Supervised Learning毒害半监督学习的无标记数据集
- 第3章 栈和队列 练习题
热门文章
- Refused to execute inline script because it violates the following Content Security Policy directive
- 双向长短期记忆网络(BiLSTM)详解
- 【挨踢人物传】小侠唐在飞:“剑胆琴心,成就网络大侠”(第四期)
- Instagram密友名单与私密账户的区别
- 模型泛化能力是什么意思
- 《50个教育法:我把三个儿子送入了斯坦福》书中的精髓:了解教育的本质,以言传身教、耐心引导的教育方式培养孩子成才。
- 【Linux】进程状态(阻塞、挂起、僵尸进程)
- Linux学习:Linux启动管理器GRUB2
- [收藏]一些电平转换方法
- java 图片互转_JAVA 图片格式转换 jpg、jpeg、png格式互转