使用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(修改计划名称, ...
随机推荐
- python函数参数与类参数
python关于函数的一些应用 前言 鉴于python3与python2有些不同,看到某些代码时可能会感到疑惑,就稍微记录一下. 一.不限制个数的函数参数 1.*args 以此为参数,会被python ...
- 全新跨平台版本.NET敏捷开发框架-RDIFramework.NET5.0震撼发布
RDIFramework.NET,基于全新.NET Framework与.NET Core的快速信息化系统敏捷开发.整合框架,给用户和开发者最佳的.Net框架部署方案.为企业快速构建跨平台.企业级的应 ...
- 33-webpack详细配置output
const { resolve } = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') module. ...
- 从零开始基于Archlinux 安装 containerd + k8s
下载ISO文件:https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest/ 目录 1. 准备工作 2. 磁盘管理 2.1 磁盘分区 2.2 磁 ...
- JUC并发常用工具学习
今天主要来和大家分享一下JUC相关的一些简单知识,线程池文章就不介绍了,前面的文章有介绍,本文主要介绍Lock和认识synchronized和并发的一些工具类的使用. Lock 传统的锁有synchr ...
- #Python 利用pandas 合并csv/xlsx文件
上次我们分享了利用powerquery来合并文件进行数据分析,但是Pq有一部分局限性,在现实工作中,我们往往需要合并多个文件去处理数据, 如果面对20个甚至更多的文件,pq中的每一步的步骤都会去读取每 ...
- 2022-12-03:部门工资最高的员工。以下数据Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。sql语句如何写? 输出结果如下: department emp
2022-12-03:部门工资最高的员工.以下数据Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高.sql语句如何写? 输出结果如下: department empl ...
- 2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的。返回其长度。
2021-03-30:给定一个整数组成的无序数组arr,值可能正.可能负.可能0.给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的.返回其长度. 福大大 答 ...
- 2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值。
2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值. 福大大 答案2021-08-15: 返回值=上+新-修正. 时间复杂度:O(N) 空间复杂度:O(N). 代码 ...
- Selenium - 模拟键盘鼠标操作
Selenium - 模拟键盘鼠标 鼠标操作 当出现由 Selenium 的 click 无法进行操作,或者需要对元素进行拖拽等操作时,可以采用鼠标模拟人工操作: from selenium impo ...