我的项目是采用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写测试的更多相关文章

  1. 玩转Javascript 给JS写测试

    给js写测试已经不是什么稀奇的事情了,最近项目里用了jasmine和JsTestDriver两种js测试框架.JsTestDriver易于与持续构建系统相集成并能够在多个浏览器上运行测试轻松实现TDD ...

  2. 使用 postman 给 API 写测试

    使用 postman 给 API 写测试 Intro 上次我们简单介绍了 使用 postman 测试 API,这次主要来写一些测试用例以检查请求的响应是否符合我们的预期以及如何使用脚本测试 使用 po ...

  3. 使用 TypeScript & mocha & chai 写测试代码实战(17 个视频)

    使用 TypeScript & mocha & chai 写测试代码实战(17 个视频) 使用 TypeScript & mocha & chai 写测试代码实战 #1 ...

  4. React简单教程-6-单元测试

    前言 我想大部分人的前端测试,都是运行项目,直接在浏览器上操作,看看功能正不正常.虽然明明有测试库可以使用,但是因为"要快"的原因,让好好做测试变成了一件影响效率的事. 因为这种无 ...

  5. 深入浅出React Native 3: 从零开始写一个Hello World

    这是深入浅出React Native的第三篇文章. 1. 环境配置 2. 我的第一个应用 将index.ios.js中的代码全部删掉,为什么要删掉呢?因为我们准备从零开始写一个应用~学习技术最好的方式 ...

  6. Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率

    测试 目前主流的就bdd和tdd,自己查一下差异 推荐 mocha和tape 另外Jasmine也挺有名,angularjs用它,不过挺麻烦的,还有一个选择是qunit,最初是为jquery测试写的, ...

  7. CDS测试框架介绍:如何为ABAP CDS Entities写测试

    动机 现在大家都知道单元测试对我们代码的好处.并且我们都承认它是开发过程中不可或缺的一部分.但是在把代码切换到数据库的模式下的时候,我们被粗暴地打回了软件测试的黑暗年代...我们现在面临着逻辑下推到A ...

  8. 【基于Puppeteer前端自动化框架】【二】PO模式,断言(如何更简便逻辑的写测试代码)

    一.概要 前面介绍了Puppeteer+jest+TypeScript做UI自动化,但是这知识基础的,我们实现自动化要考虑的很多,比如PO模式,比如配置文件,比如断言等等.下面就来一一实现我是怎么用p ...

  9. Django为数据库的ORM写测试例(TestCase)

    models.py里的数据库定义如下: from django.db import models # Create your models here. class Teachers(models.Mo ...

  10. Jmeter4.0----编写测试脚本(5)

    1.说明 以HTTP请求为例,和小伙伴门分享一下jmeter测试脚本的基本编写步骤 2.步骤说明 第一步:打开jmeter,更改测试计划名称为 Test batchSignForDir(修改计划名称, ...

随机推荐

  1. 10分钟理解React生命周期

    前言 学习React,生命周期很重要,我们了解完生命周期的各个组件,对写高性能组件会有很大的帮助. 一.简介 React /riˈækt/ 组件的生命周期指的是组件从创建到销毁过程中所经历的一系列方法 ...

  2. C 语言版线程池

    一.初始线程池 1.1 何为线程池? 我们先来打个比方,线程池就好像一个工具箱,我们每次需要拧螺丝的时候都要从工具箱里面取出一个螺丝刀来.有时候需要取出一个来拧,有时候螺丝多的时候需要多个人取出多个来 ...

  3. DRF的认证组件(源码分析)

    DRF认证组件(源码分析) 1. 数据库建立用户表 在drf中也给我们提供了 认证组件 ,帮助我们快速实现认证相关的功能,例如: # models.py from django.db import m ...

  4. Python 函数返回值及传递列表

    函数返回值 函数并非总是直接显示输出,它可以处理一些数据,并返回一个或一组值,函数返回的值被称为返回值. 使用return语句将值返回到调用函数的代码行中 # 返回简单值 def get_format ...

  5. 2020-12-07:go中,slice的底层数据结构是什么?

    福哥答案2020-12-07: 源码位于runtime/slice.go文件中的slice结构体. type slice struct { array unsafe.Pointer len int c ...

  6. 2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试

    2021-12-24:划分字母区间. 字符串 S 由小写字母组成.我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中.返回一个表示每个字符串片段的长度的列表. 力扣763.某大厂面试 ...

  7. docker安装go-fastdfs

    1.docker命令安装 docker run -d --name fastdfs -p 8180:8080 sjqzhang/go-fastdfs 2.浏览器访问 http://192.168.20 ...

  8. Actor Prioritized Experience Replay

    论文宗旨: 由于PER 是以TD-error成正比的非均匀概率进行抽样的,但是在AC算法中即连续动作空间中,会表现出低效果. 分析结果是:Actor不能有效的从high TD-error的transi ...

  9. Qt+QtWebApp开发笔记(四):http服务器使用Session和Cookie实现用户密码登录和注销功能

    前言   前面实现了基础的跳转,那么动态交互中登录是常用功能.  本篇实现一个动态交互的简单登录和注销功能,在Qt中使用Session和Cookie技术.   Demo    下载地址   链接:ht ...

  10. 终极指南!Terraform的进阶技巧

    如果您已经对 Terraform 了如指掌,并期望自己的 IaC 技能有进一步提升的话,这篇文章很适合您!在本文中,我们将分享一些 Terraform 的高级使用技巧.从使用模块(module).工作 ...