使用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(修改计划名称, ...
随机推荐
- 特性介绍 | MySQL 测试框架 MTR 系列教程(一):入门篇
作者:卢文双 资深数据库内核研发 去年年底通过微信公众号[数据库内核]设定了一个目标--2023 年要写一系列 特性介绍+内核解析 的文章(现阶段还是以 MySQL 为主). 虽然关注者很少,但本着& ...
- [图像处理]仿射变换(Affine Transformation)
文章目录 仿射变换(Affine Transformation) 平移变换 Translation 缩放变换(Scale) 剪切变换(Shear) 旋转变换(Rotation) 组合 仿射变换(Aff ...
- Docker compose单机编排工具
Docker compose单机编排工具 目录 Docker compose单机编排工具 docker-compose介绍 Docker Compose使用的三步: docker-compose安装部 ...
- 🚀 jdbc-plus是一款基于JdbcTemplate增强工具包, 已实现分页、多租户、动态表名等插件,可与mybatis、mybatis-plus等混合使用
jdbc-plus简介 jdbc-plus是一款基于JdbcTemplate增强工具包, 基于JdbcTemplate已实现分页.多租户.动态表名等插件,可自定义扩展插件,可与mybatis.myba ...
- 2020-12-31:tcp三次握手,最后一次失败,网络会怎么样?
福哥答案2020-12-31:[答案来自此链接:](https://www.zhihu.com/question/437249958)第一次握手:建立连接时,客户端发送syn包(syn=a)到服务器, ...
- phpstudy-pikachu-数字型注入(post)
抓包搞到格式 id=1&submit=%E6%9F%A5%E8%AF%A2 查字符段 id=1 order by 2&submit=%E6%9F%A5%E8%AF%A2 id=1 un ...
- 第十三届蓝桥杯c++b组国赛题解(还在持续更新中...)
试题A:2022 解题思路: 有2022个物品,它们的编号分别是1到2022,它们的价值分别等于它们的编号.也就是说,有2022种物品,物品价值等于物品编号. 从2022个物品种选取10个物品,满足1 ...
- web自动化04-css定位
css元素定位 1. 是什么? 用来描述html元素的显示样式 选择器是一种模式,用于选择需要添加样式的元素 selenium中推荐使用css定位,比XPath定位要快 2.如何定位? ...
- rest framwork 4 分页功能
分页功能: 常遇到问题,当数据记录超过1000万条,如何进行分页显示问题,这时就考虑分页功能, restframework 分页实现有三种 第一种:看n页,每页显示n条数据: PageNumberPa ...
- CKS 考试题整理 (01)-NetworkPolicy
Task 创建一个名为 pod-restriction 的 NetworkPolicy 来限制对在 namespace dev-team 中运行的 Pod products-service 的访问. ...