[Jest] 模拟 ES6 类

news/2025/1/29 7:10:34/文章来源:https://www.cnblogs.com/Answer1215/p/18692809

我们知道,在 ES6 中所提供的 class 本质上是一个语法糖,背后实际上是一个构造函数,因此在对类进行测试的时候,也可以使用 jest.mock 或者 jest.spyOn 来进行模拟测试。

经常我们会遇到这种情况:在测试一个模块的时候,这个模块依赖了其他的类,那么这个时候为了屏蔽其影响,我们需要模拟依赖的类

import ReviewCollector from "../ts/reviewCollector";
import ProductReview from "../ts/productReview";// 我们这个测试套件是要对 ReviewCollector 进行测试
// 但是 ReviewCollector 又依赖了 ProductReview 这个类
// 为了屏蔽其影响,我们需要模拟 ProductReview 这个类// 使用 jest.mock 就可以模拟
jest.mock("../ts/productReview", () => {return jest.fn().mockImplementation((name: string, review: string) => {return {name,review,};});
});

在上面的代码中,我们要对 ReviewCollector 进行测试,但是这个类里面又用到了 ProductReview,因此我们采取对 ProductReview 进行一个模拟。

之后就可以在测试用例中正常的使用 ProductReview 即可

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"]).toContain("产品A");});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.spyOn 来进行一个监听。

// 对 ProductReview 这个类的一些方法进行一些模拟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();
})

在上面的代码中,我们是对 ProductReview 类的 getter 方法以及静态方法进行了一个模拟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/876310.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库服务器 SQL Server 版本升级公告

祝大家春节快乐 !在明天(1月28日)的辞旧迎新之际,我们也安排了对园子的数据库服务器进行一次辞旧迎新,从 SQL Server 2016 升级至 SQL Server 2022。 我们使用的是阿里云 RDS 云数据库服务,升级将会由 RDS 自动完成,但在升级过程中的切换阶段会造成有段时间不能正常访问…

两种方式让你用Python轻松在RDKX5上部署推理

作者:SkyXZ CSDN:SkyXZ~-CSDN博客 博客园:SkyXZ - 博客园 宿主机环境:WSL2-Ubuntu22.04+Cuda12.6、D-Robotics-OE 1.2.8、Ubuntu20.04 GPU Docker 端侧设备环境:RDK X5-Server-3.1.0 2025年随着RDK X5的发布,地瓜官方随之也开放了RDK系列DNN推理部署的Python版的…

01. 初识Linux系统

一、什么是Ubuntu系统Ubuntu 操作系统是属于 Linux 操作系统中的一种,它是免费、稳定又可以拥有绚丽界面的一个操作系统。Linux,一般指 GNU/Linux(单独的 Linux 内核并不可直接使用,一般搭配 GNU 套件,故得此称呼),是一种免费使用和自由传播的类 UNIX 操作系统,其内核由…

学习elemetnPlus

学习了elementplus 学习了一个小时 其实就是查文档 做前端

20221320冯泰瑞-实验四密码模块应用实践过程记录

20221320冯泰瑞-实验四密码模块应用实践过程记录 实践要求完成电子公文交换系统,系统功能,(15 分)mindmaproot((电子公文系统))发文公文起草公文查看发文审核(审核员)公文发送公文查询收文公文签收公文查看公文处理公文查询系统管理组织单位用户管理操作员(科员)审核员…

android抓包相关操作指令

adb start-server adb connect 127.0.0.1:16384 adb rootadb shell su # 如果需要root权限mount -o remount,rw /systemadb push D:\\文档\\sixdu文档\\269953fb.0 /data/local/tmp adb push D:\\文档\\sixdu文档\\43b5e6bf.0 /data/local/tmpadb -s emulator-5554 push D:\\文…

四.1 Redis 五大数据类型/结构的详细说明/详细使用(List 列表数据类型详解和使用)

四.1 Redis 五大数据类型/结构的详细说明/详细使用(List 列表数据类型详解和使用) @目录四.1 Redis 五大数据类型/结构的详细说明/详细使用(List 列表数据类型详解和使用)2. list 列表常用指令(详细讲解说明)2.1 lpush/rpush <key><value1><value2>&l…

DeepSeek入门教程

一、简介 DeepSeek-V3 是一款高性能的开源 AI 模型,支持自然语言处理、智能对话生成等任务。其 API 接口与 OpenAI 完全兼容,用户可以通过简单的配置迁移现有项目,同时享受更低的成本和更高的性能。本文档将详细介绍如何快速接入 DeepSeek-V3 API 二、注册与API Key获取 1.注…

Archlinux 玩原神

首先你需要一台装载了archlinux的电脑,配置的话本人:Lenovo TianYi510S-07IMB Intel Core™ i5-10400 12 内存 8.0 GiB 磁盘 1 TB 玩的挺舒服的不会安装arch或者wine的看这里 然后本人是国际服Genshin Impact,国服同理(把下文的Genshin Impact当作yuanshen),参照官网安装…

C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…

JQuery实现轮播图

一、html代码<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title> </he…

e语言 超级编辑框

本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/18692666