Jest进阶知识:模拟 ES6 类 - 掌握类的依赖模拟与方法监听技巧
引言
在现代前端开发中,ES6 类(class)是常用的一种面向对象编程方式。在测试类的时候,我们经常需要模拟类的依赖,以避免外部因素对测试结果的影响。Jest 提供了强大的工具来模拟类及其方法,确保测试的高效性和准确性。本文将详细介绍如何在 Jest 中模拟 ES6 类,确保类的依赖和方法在测试中能够高效、准确地运行。
模拟类的依赖
在测试一个模块时,如果该模块依赖了其他类,为了屏蔽其影响,我们需要模拟这些依赖的类。jest.mock 方法可以帮助我们实现这一点。
使用示例
假设我们有一个 ReviewCollector 类,它依赖于 ProductReview 类:
// reviewCollector.ts
import ProductReview from "./productReview";class ReviewCollector {private productList: Map<string, { good: number, total: number }> = new Map();addReview(review: ProductReview) {const productName = review.name;const isGood = review.review.includes("好用");if (!this.productList.has(productName)) {this.productList.set(productName, { good: 0, total: 0 });}const product = this.productList.get(productName)!;product.total++;if (isGood) {product.good++;}}getNumGoodReview(productName: string): number {const product = this.productList.get(productName);return product ? product.good : 0;}
}export default ReviewCollector;
// productReview.ts
class ProductReview {constructor(public name: string, public review: string) {}static showInfo(): string {return "这是一个产品评论";}
}export default ProductReview;
为了测试 ReviewCollector 类,我们需要模拟 ProductReview 类:
import ReviewCollector from "../ts/reviewCollector";
import ProductReview from "../ts/productReview";// 使用 jest.mock 模拟 ProductReview 类
jest.mock("../ts/productReview", () => {return jest.fn().mockImplementation((name: string, review: string) => {return {name,review,};});
});describe("测试 ReviewCollector", () => {let collector: ReviewCollector;beforeEach(() => {collector = new ReviewCollector();});test("能够添加一条评论", () => {const review = new ProductReview("产品A", "好用");collector.addReview(review);// 进行断言测试expect(collector.getNumGoodReview("产品A")).toBe(1);expect(collector["productList"].has("产品A")).toBe(true);});test("能够获取好评数", () => {const review1 = new ProductReview("产品A", "好用");const review2 = new ProductReview("产品A", "一般");const review3 = new ProductReview("产品B", "好用");collector.addReview(review1);collector.addReview(review2);collector.addReview(review3);// 进行断言测试expect(collector.getNumGoodReview("产品A")).toBe(1);expect(collector.getNumGoodReview("产品B")).toBe(1);});
});
在这个示例中,我们使用 jest.mock 模拟了 ProductReview 类,使其返回一个简单的对象,从而避免了外部因素对测试结果的影响。
监听类的方法
有时候,我们需要对类的方法进行监听,以验证这些方法是否被正确调用。jest.spyOn 方法可以帮助我们实现这一点。
使用示例
假设我们想对 ProductReview 类的 getter 方法和静态方法进行监听:
import ProductReview from "../ts/productReview";// 模拟类的 getter
const mockName = jest.spyOn(ProductReview.prototype, "name", "get").mockImplementation(() => "小米手机");
const mockReview = jest.spyOn(ProductReview.prototype, "review", "get").mockImplementation(() => "很好用");// 模拟类的静态方法
const mockStatic = jest.spyOn(ProductReview, "showInfo").mockImplementation(() => "静态方法");test("ProductReview", () => {const p = new ProductReview("", "");const result = ProductReview.showInfo();// 断言expect(mockStatic).toHaveBeenCalled();expect(result).toBe("静态方法");expect(p.name).toBe("小米手机");expect(p.review).toBe("很好用");expect(mockName).toHaveBeenCalled();expect(mockReview).toHaveBeenCalled();
});
在这个示例中,我们使用 jest.spyOn 方法监听了 ProductReview 类的 getter 方法和静态方法,并通过 mockImplementation 重新定义了这些方法的行为。这样可以在测试中验证这些方法是否被正确调用。
总结
在 Jest 中模拟 ES6 类是确保类的依赖和方法在测试中高效、准确运行的关键。通过使用 jest.mock 方法,我们可以模拟类的依赖,避免外部因素对测试结果的影响;通过使用 jest.spyOn 方法,我们可以监听类的方法,验证这些方法是否被正确调用。
具体来说:
jest.mock用于模拟类的依赖,帮助我们隔离外部因素对测试结果的影响。jest.spyOn用于监听类的方法,帮助我们验证这些方法是否被正确调用,同时还可以控制所监听的方法的行为。
通过这些工具和方法,我们可以编写全面而准确的测试用例,确保类的可靠性和健壮性。希望本文的介绍和示例能帮助你在实际开发中更好地应用这一强大工具。
相关文章:
Jest进阶知识:模拟 ES6 类 - 掌握类的依赖模拟与方法监听技巧
引言 在现代前端开发中,ES6 类(class)是常用的一种面向对象编程方式。在测试类的时候,我们经常需要模拟类的依赖,以避免外部因素对测试结果的影响。Jest 提供了强大的工具来模拟类及其方法,确保测试的高效…...
前端Nginx的安装与应用
目录 一、前端跨域方式 1.1、CORS(跨域资源共享) 1.2、JSONP(已过时) 1.3、WebSocket 1.4、PostMessage 1.5、Nginx 二、安装 三、应用 四、命令 4.1、基本操作命令 4.2、nginx.conf介绍 4.2.1、location模块 4.2.2、反向代理配置 4.2.3、负载均衡模块 4.2.4、通…...
Java设计模式(代理模式整理中ing)
一、代理模式 1、代理模式定义: 代理模式:由于某些原因要给某对象提供一个代理以控制对该对象的访问,这时访问对象不适合或者不能够直接引用目标对象,代理对象作为访问对象与目标对象之间的中介进行连接调控调用。 2、代理模式的…...
第J9周:Inception v3算法实战与解析(pytorch版)
>- **🍨 本文为[🔗365天深度学习训练营]中的学习记录博客** >- **🍖 原作者:[K同学啊]** 📌本周任务:📌 了解并学习InceptionV3相对与InceptionV1有哪些改进的地方 使用Inception完成天气…...
如何封装一个axios,封装axios有哪些好处
什么是Axios Axios 是一个基于 Promise 的 HTTP 客户端,用于在浏览器和 Node.js 中发送异步网络请求。它简化了发送 GET、POST、PUT、DELETE 等请求的过程,并且支持请求拦截、响应拦截、取消请求和自动处理 JSON 数据等功能。 为什么要封装Axios 封装…...
java的批量update
这个问题挺有代表性的,今天拿出来给大家一起分享一下,希望对你会有所帮助。 1 案发现场 有一天上午,在我的知识星球群里,有位小伙伴问了我一个问题:批量更新你们一般是使用when case吗?还是有其他的批量更…...
go语言连续监控事件并回调处理
前言 go语言中使用回调函数处理事件:事件监测部分(如无限循环中的事件检测逻辑)可以独立于具体的业务处理逻辑。这使得代码的各个部分更加清晰,易于理解和维护。如果需要更改事件处理的方式,只需要修改注册的回调函数…...
1.探索WebSocket:实时网络的心跳!
序言 你可能听说过"WebSokcet"这个词,感觉它好像很高深,但其实它是一个超级酷的小工具,让我们在Web应用里实现实时通信。想象一下,你可以像聊天一样,在浏览器和服务器之间来回“畅聊“,没有延迟…...
uniapp学习(010-2 实现抖音小程序上线)
零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第113p的内容 文章目录 抖音小程序下载抖音开发者工具先去开发者工具里进行测试 抖音开放平台配置开始打包上传…...
测试和实施面试题收集
前端+测试+运维+算法综合 前端部分面试题 判断第二个日期比第一个日期大 如何用脚本判断用户输入的的字符串是下面的时间格式2004-11-21 必须要保证用户的输入是此格式,并且是时间,比如说月份不大于12等等,另外我需要用户输入两个,并且后一个要比前一个晚,只允许用JAVASCR…...
【Vue3】一文全览基础语法-案例程序及配图版
文章目录 Vue应用基本结构模块化开发ref和reactive绑定事件 v-on 简写显示和隐藏 v-show条件渲染 v-if动态属性绑定 v-bind 简写:遍历数组或对象 v-for双向数据绑定 v-model渲染数据 v-text 和 v-html计算属性 computed侦听器 watch自动侦听器 watchEffect 本文示例…...
【OpenSearch】安装部署OpenSearch和OpenSearch-Dashboard
一、安装OpenSearch 1.禁用主机swap提高性能 sudo swapoff -a2.增加OpenSearch可用的内存映射数量。 编辑sysctl配置文件 sudo vi /etc/sysctl.conf在文件中添加一行来定义所需的值, 或者如果键存在,则更改值,然后保存您的更改。 vm.max…...
【系统架构设计师】2023年真题论文: 论软件可靠性评价的设计与实现(包括和素材和论文)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2023年 试题3)论文素材参考论文参考摘要正文总结真题题目(2023年 试题3) 软件可靠性评价是利用可靠性数学模型、统计技术等,对软件失效数据进行处理,评估和预测软件可靠性的过程,包括选择模型、收集数…...
教程:使用 InterBase Express 访问数据库(二)
1. 添加数据模块(IBX 通用教程) 本节将创建一个数据模块(TDataModule),这是一种包含应用程序使用的非可视组件的表单。 以下是完全配置好的 TDataModule 的视图: 创建 TDataModule 后,您可以在其他表单中使用这个数据模块。 2. 添加 TDataModule 要将数据模块添加到…...
Windows密码的网络认证---基于挑战响应认证的NTLM协议
一,网络认证NTLM协议简介 在平时的测试中,经常会碰到处于工作组的计算机,处于工作组的计算机之间是无法建立一个可信的信托机构的,只能是点对点进行信息的传输。 举个例子就是,主机A想要访问主机B上的资源,…...
fpga 常量无法改变
parameter LED_ON_PERIOD0 n0*CLOCK_FREQ; parameter LED_OFF_PERIOD0 (2-n0)*CLOCK_FREQ;这种代码的变量不会无法内部修改 需要改成reg形式并在这种逻辑里面修改变量 always (posedge clk_ref or negedge sys_rst_n) begin虽然是并行逻辑 但是变量尽量还是先赋值从硬件上并…...
【HarmonyOS NEXT】如何给未知类型对象定义类型并使用递归打印所有的Key
关键词:嵌套对象、类型、递归、未知类型 目录 使用 Record 与 ESObject 定义未知对象类型 递归打印未知类型对象的key 在鸿蒙应用开发中,所有的数据都必须定义类型,且不存在 any 类型,那么我们当遇到 key 值可能随时变化的情况…...
RuoYi 样例框架运行步骤(测试项目自用,同学可自取)
目录 后台 API 运行导入,下载包端口号mysql 准备运行 PC(电脑端)运行安装 nodejs安装 yarn 及其依赖,启动服务登录admin(admin123) 或 ry(admin123) App(移动)运行下载 HBuilderX运行app运行注意࿱…...
Java进程CPU飙高排查
一、首先通过top指令查看当前占用CPU较高的进程pid 二、查看当前进程消耗资源的线程PID: top -Hp pid 使用 top -Hp <pid> 命令(pid为Java进程的id号)查看该Java进程内所有线程的资源占用情况。 三、通过print命令将线程pid转为16进…...
conda的对应环境下安装cuda11.0和对应的cudnn
在 Conda 环境中安装 CUDA 11.0 和对应的 cuDNN,可以按照以下步骤进行: 一. 环境配置 1. 创建 Conda 环境 首先,创建一个新的 Conda 环境(可选): conda create -n myenv python3.8 conda activate myen…...
Java TCC到底要不要用?90%团队踩坑的4个认知误区,今天一次性说透
第一章:Java TCC到底要不要用?90%团队踩坑的4个认知误区,今天一次性说透TCC(Try-Confirm-Cancel)作为分布式事务的一种经典模式,在 Java 生态中常被误认为“高可用银弹”或“微服务标配”。但真实生产实践中…...
ChatGPT_JCM路由管理策略:SPA应用的导航设计与实现
ChatGPT_JCM路由管理策略:SPA应用的导航设计与实现 【免费下载链接】ChatGPT_JCM 项目地址: https://gitcode.com/gh_mirrors/ch/ChatGPT_JCM ChatGPT_JCM是一个基于Vue2开发的OpenAI Web管理界面,提供完整的路由管理策略和单页面应用导航设计。…...
OpenClaw小龙虾初体验【安装学习】
文章目录一、前言二、安装三、360安全龙虾四、腾讯龙虾4.1 文件移动4.2 应用分析4.3 Docker失败原因一、前言 最近小龙虾很火,不禁能说还能做,本质就类似木马,获取电脑权限,不禁能操作各应用还能联动外接设备。 那肯定要学习一下…...
ESP32/ESP8266轻量级MQTT连接管理库espMqttManager
1. 项目概述espMqttManager是一个面向 ESP32/ESP8266 平台、基于 Arduino 框架的轻量级 MQTT 连接管理库。它并非独立 MQTT 协议栈,而是对espMqttClient(由marvinroger 开发的高性能异步 MQTT 客户端)进行工程化封装的“胶水层”,…...
三菱现代自动擦窗机器人PLC软件:后发产品介绍及技术细节
三菱 现代自动擦窗机器人PLC软件 我们主要的后发送的产品有,带解释的梯形图接线图原理图图纸,io分配,组态画面 界面多种组态可供选择上周刚帮一个三菱现代贴牌擦窗机的小客户把新软件迭代完,顺便攒了一套带人话解释的梯形图、不…...
终极指南:如何快速完成语雀文档批量导出与迁移
终极指南:如何快速完成语雀文档批量导出与迁移 【免费下载链接】yuque-exporter export yuque to local markdown 项目地址: https://gitcode.com/gh_mirrors/yuq/yuque-exporter 在当今数字化创作时代,语雀文档批量导出已成为许多创作者和团队的…...
QQ音乐加密文件完整解码指南:qmcdump终极教程
QQ音乐加密文件完整解码指南:qmcdump终极教程 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 还在为QQ音乐下…...
FastAPI + TinyDB并发陷阱与实战:告别数据错乱的解决方案
核心摘要本文针对在FastAPI框架下使用TinyDB(JSON文件数据库)时遇到的并发写入数据冲突、错乱问题,深入浅出地解释了问题根源,并提供了从“文件锁”到“内存队列”再到“乐观锁”的三种由浅入深的实战解决方案,帮助你根…...
OpenClaw个性化设置:Qwen3.5-9B模型参数调优实战
OpenClaw个性化设置:Qwen3.5-9B模型参数调优实战 1. 为什么需要调整模型参数? 上周我在用OpenClaw自动处理一批技术文档时,遇到了一个奇怪的现象:同样的任务指令,有时候AI能完美执行,有时候却会输出一堆无…...
C#编写CIP通讯源码——欧姆龙NX1P通讯DEMO
C#编写CIP通讯源码,欧姆龙NX1P通讯DEMO一、概述 本代码是基于C#语言开发的CIP(Common Industrial Protocol)通讯Demo程序,专门用于与欧姆龙NX1P2系列PLC进行工业通讯交互。程序采用.NET Framework 4.8框架开发,通过TCP…...
