使用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(修改计划名称, ...
随机推荐
- 在 plist 中轻松转换两种格式
在 plist 中,有两种常见的格式:.plist 和 .plistx.这两种格式有什么区别?它们之间如何相互转换?本文将为您详细解答. 在 iOS 上架时,需要将 plist 文件上传到苹果的 ...
- Typora 最新中文版安装破解V1.4.8
Typora中文破解版是一款好用极简免费的跨平台Markdown编辑器,软件使用这款软件能够帮助用户轻松将文本转换到HTML,软件从底层向上设计,软件支持markdown的标准语法,同时这款软件还支持 ...
- 纯前端使用xlsx实现导出表格
列表数据纯前端使用xlsx实现导出功能 基础写法 let filename = "资产导出.xlsx"; 定义导出数据 let data = [ ["第一列", ...
- Costura.Fody 使用问题
1. Costura.Fody 引用后,未能正常合并资源文件.用着用着就不行了 解决方案:在csproj所在的文件目录,找到FodyWeavers.xml,添加<Costura/> 1 & ...
- MQTT-会话
MQTT会话 为什么需要会话 假如有以下场景,客户端A发送消息到服务端,服务端转发给客户端B,如果这个时候服务端和客户端B的网络连接断开,那么就无法保证消息到达,并且客户端A不知道B连接断开,还会 ...
- 2023 Hubei Provincial Collegiate Programming Contest题解 C F H I J K M
补题链接:https://codeforces.com/gym/104337 原文链接:https://www.eriktse.com/algorithm/1136.html M. Different ...
- Nuxt3.0中使用EChart可视化图表📊
在Nuxt3.0项目中用到了可视化图表,于是我用了EChart可视化图表库.但是在官网我没有找到针对在Nuxt3.0中使用EChart的方法,于是在这里记录我的引入EChart并简单使用的步骤.需要声 ...
- 2022-12-10:给你一个由小写字母组成的字符串 s ,和一个整数 k 如果满足下述条件,则可以将字符串 t 视作是 理想字符串 : t 是字符串 s 的一个子序列。 t 中每两个 相邻 字母在字
2022-12-10:给你一个由小写字母组成的字符串 s ,和一个整数 k 如果满足下述条件,则可以将字符串 t 视作是 理想字符串 : t 是字符串 s 的一个子序列. t 中每两个 相邻 字母在字 ...
- 2022-04-28:有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,
2022-04-28:有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始, ...
- prefetch_related() 一对多、多对多查询优化,反向查询
prefetch_related() 一对多.多对多查询优化,反向查询 Student.objects.filter(age__lt=30).prefetch_related('course') # ...