使用react-test-renderer/shallow写测试
我的项目是采用react + ts来写的,项目中要写单元测试,于是采用了Jest库, 主要用的package有
react-test-renderer react-test-renderer/shallow @jest/globals
这里展示shallow的用法,主要用来测导航栏组件

1 import {createRenderer} from "react-test-renderer/shallow";
2 import {afterEach, beforeEach, describe, expect, it} from "@jest/globals";
3 import * as React from "react";
4
5
6 describe("render element", () => {
7 //创建renderer
8 const wrapper = createRenderer();
9 let elements: JSX.Element;
10 let leftEle: JSX.Element;
11 let linkContainerEle: JSX.Element;
12 beforeEach(() => {
13 //浅渲染组件
14 wrapper.render(renderFrame());
15
16 //获取到最外层的某个元素
17 elements = wrapper.getRenderOutput();
18
19
20
21 //get element
22 leftEle = elements.props.children[0];
23
24
25
26 //get element
27 linkContainerEle = elements.props.children[1];
28 });
29
30
31
32 afterEach(() => {
33 wrapper.unmount();
34 });
35
36
37 //这里是测渲染,(Link的to属性)
38 it("the link of logo icon connect to 'testNav'", () => {
39 //get element
40 const logoIconEle = leftEle.props.children[0];
41 expect(logoIconEle.props.to).toBe("testNav");
42 });
43
44 // 这里测事件---这个方法可行,但是原理我不是很明白
45 it("when click 'icon', hidden/display box", () => {
46 // mock event
47 const event: {nativeEvent: {stopImmediatePropagation: () => void}} = {
48 nativeEvent: {
49 stopImmediatePropagation: () => {
50 // do nothing
51 },
52 },
53 };
54 // simulate user action, click icon
55 //不直接找到icon元素,调用它的点击事件,而是找到点击事件对应的函数,直接调这个函数
56 wrapper.getMountedInstance()["changeShowBox"](event);
57
58
59
60 // so state showBox become true
61 expect(wrapper.getMountedInstance()["state"]["showBox"]).toBeTruthy;
62 });
63
64
65
66
67 });
上述两个方法只能说可行,具体的用法可能不太正确
下面展示react-test-renderer测导航栏组件的用法(个人比较推荐)
1 describe("TopNavigationBar - lineFilter", () => {
2 //渲染导航栏父组件
3 const renderFrames = (lineFilterArr?: string[]) => (
4 <HashRouter>
5 <TopNavigationBar
6 routePath={routePath}
7 history={history}
8 location={location}
9 match={match}
10 lineFilters={lineFilterArr ? lineFilterArr : ["line1", "line2"]}
11 />
12 </HashRouter>
13 );
14
15 let newFrame: ReactTestRenderer;
16 let topNavComponent: ReactTestInstance;
17 beforeEach(() => {
18 //调用渲染方法
19 newFrame = create(renderFrames());
20 // 找到导航栏组件
21 topNavComponent = newFrame.root.findByType(TopNavigationBar);
22 });
23 afterEach(() => {
24 newFrame.unmount();
25 });
26
27 it("render state 'lineFilter'", () => {
28 //找到state中对应的值
29 const stateLineFilters = topNavComponent.instance.state.lineFilters;
30 const received: ILineFilter[] = [
31 {
32 text: "line1",
33 selected: false,
34 },
35 {
36 text: "line2",
37 selected: false,
38 },
39 ];
40 // render state lineFilter
41 expect(JSON.stringify(stateLineFilters)).toEqual(JSON.stringify(received));
42 });
43
44 it("when select on item, change state 'lineFilter'", () => {
45 // simulate select one item
46 const selectedLine: ILineFilter = {
47 text: "line1",
48 selected: false,
49 };
50 //找到该元素,调用元素绑定的onClick方法
51 topNavComponent.findAllByProps({className: "tes-topNavBar-line"})[0].props.onClick(selectedLine);
52
53 const lineFilterArr: ILineFilter[] = topNavComponent.instance.state.lineFilters;
54 lineFilterArr.forEach((e) => {
55 // so this item 'selected' property changed
56 if (e.text === selectedLine.text) expect(e.selected).toBeTruthy;
57 });
58 });
59
60 it("when props 'lineFilters' changed, change state 'lineFilters'", () => {
61 // 修改父级传入的API lineFilters
62 newFrame.update(renderFrames(["11", "22"]));
63 const topNav = newFrame.root.findByType(TopNavigationBar);
64 const stateLineFilters = topNav.instance.state.lineFilters;
65 const receivedArr: ILineFilter[] = [
66 {
67 text: "11",
68 selected: false,
69 },
70 {
71 text: "22",
72 selected: false,
73 },
74 ];
75 //测试state,渲染对应的值
76 expect(JSON.stringify(stateLineFilters)).toEqual(JSON.stringify(receivedArr));
77 });
78 });
使用react-test-renderer/shallow写测试的更多相关文章
- 玩转Javascript 给JS写测试
给js写测试已经不是什么稀奇的事情了,最近项目里用了jasmine和JsTestDriver两种js测试框架.JsTestDriver易于与持续构建系统相集成并能够在多个浏览器上运行测试轻松实现TDD ...
- 使用 postman 给 API 写测试
使用 postman 给 API 写测试 Intro 上次我们简单介绍了 使用 postman 测试 API,这次主要来写一些测试用例以检查请求的响应是否符合我们的预期以及如何使用脚本测试 使用 po ...
- 使用 TypeScript & mocha & chai 写测试代码实战(17 个视频)
使用 TypeScript & mocha & chai 写测试代码实战(17 个视频) 使用 TypeScript & mocha & chai 写测试代码实战 #1 ...
- React简单教程-6-单元测试
前言 我想大部分人的前端测试,都是运行项目,直接在浏览器上操作,看看功能正不正常.虽然明明有测试库可以使用,但是因为"要快"的原因,让好好做测试变成了一件影响效率的事. 因为这种无 ...
- 深入浅出React Native 3: 从零开始写一个Hello World
这是深入浅出React Native的第三篇文章. 1. 环境配置 2. 我的第一个应用 将index.ios.js中的代码全部删掉,为什么要删掉呢?因为我们准备从零开始写一个应用~学习技术最好的方式 ...
- Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率
测试 目前主流的就bdd和tdd,自己查一下差异 推荐 mocha和tape 另外Jasmine也挺有名,angularjs用它,不过挺麻烦的,还有一个选择是qunit,最初是为jquery测试写的, ...
- CDS测试框架介绍:如何为ABAP CDS Entities写测试
动机 现在大家都知道单元测试对我们代码的好处.并且我们都承认它是开发过程中不可或缺的一部分.但是在把代码切换到数据库的模式下的时候,我们被粗暴地打回了软件测试的黑暗年代...我们现在面临着逻辑下推到A ...
- 【基于Puppeteer前端自动化框架】【二】PO模式,断言(如何更简便逻辑的写测试代码)
一.概要 前面介绍了Puppeteer+jest+TypeScript做UI自动化,但是这知识基础的,我们实现自动化要考虑的很多,比如PO模式,比如配置文件,比如断言等等.下面就来一一实现我是怎么用p ...
- Django为数据库的ORM写测试例(TestCase)
models.py里的数据库定义如下: from django.db import models # Create your models here. class Teachers(models.Mo ...
- Jmeter4.0----编写测试脚本(5)
1.说明 以HTTP请求为例,和小伙伴门分享一下jmeter测试脚本的基本编写步骤 2.步骤说明 第一步:打开jmeter,更改测试计划名称为 Test batchSignForDir(修改计划名称, ...
随机推荐
- 网络框架重构之路plain2.0(c++23 without module) 环境
接下来本来就直接打算分享框架重构的具体环节,但重构的代码其实并没有完成太多,许多的实现细节在我心中还没有形成一个定型.由于最近回归岗位后,新的开发环境需要自己搭建,搭建的时间来说花了我整整一天的时间才 ...
- 基于海思H3520DV400和QT5.9设计的车载终端DVR控制平台
目录 前言: 说明: 功能介绍: 设计思路: 详细设计: QT界面设计: 代码实现: 注意事项: (一)QT运行慢问题 (二)QT图层隐藏问题 (三)鼠标问题 (四)字体问题 (五)主界面图案 ( ...
- R-SVM-plot踩坑记录
并非所有的 svm 类型都支持plot.svm- 只有分类方法支持,而回归不支持. 所以代码应该svm_fit <- svm(factor(y)~x1+x2,data = df, kernel ...
- 快速上手Linux核心命令(三):文件和目录操作命令
@ 目录 前言 cd 切换目录 pwd 显示当前路径 ls 显示目录下内容及相关属性信息 mkdir 创建目录 tree 以树形结构显示目录下的内容 touch 创建空白文件或改变文件的时间戳属性 c ...
- 「学习笔记」重修 FHQ-treap
无旋 treap 的操作方式使得它天生支持维护序列.可持久化等特性. 无旋 treap 又称分裂合并 treap.它仅有两种核心操作,即为 分裂 与 合并.通过这两种操作,在很多情况下可以比旋转 tr ...
- python字符串集合面试笔试题
python字符串面试笔试题 以下代码的输出是? s = 'foo' t = 'bar' print('barf' in 2 * (s + t)) A.True B.Fasle +运算符连接字符串,而 ...
- RTCP常见报文格式(申请I帧/RR/SR/SDES)
本篇文章是基于对RTCP基本协议有所了解情况下,进行说明,因为RTCP在丢包重传(ARQ)方面需要使用 到,具体可以查看RTCP相关rfc文档或者博客.所以本篇文章主要是从抓包报文角度来看RTCP协议 ...
- 粘包/拆包问题一直都存在,只是到TCP就拆不动了。
OSI open-system-Interconnection TCP/IP 5层协议栈 应用层和操作系统的边界是 系统调用 ,对应到网络编程是socket api TCP/UDP 概况 TCP粘包问 ...
- 2022-07-26:以下go语言代码输出什么?A:5;B:hello;C:编译错误;D:运行错误。 package main import ( “fmt“ ) type integer in
2022-07-26:以下go语言代码输出什么?A:5:B:hello:C:编译错误:D:运行错误. package main import ( "fmt" ) type inte ...
- docker安装es和kibana,单机模式
操作系统:mac系统 1.安装es docker pull elasticsearch:7.14.0 docker run --name es -p 9200:9200 -p 9300:9300 -e ...