Jest timers

news2025/1/23 13:10:51

引入

我们自己先写一个定时器,在这里,这个测试是一定会通过的,因为他一旦传入callback,就算是完成了,而不是在意你的运行结果了,而且你的定时器还有几秒呢

export const timer = (fn) => {
    setTimeout(() => {
        fn()
    }, 3000)
}


//test
import {timer} from "./timer"


it("测试timer", () => {
    timer(() => {
        expect(1).toBe(1)
    })
})

 done

所以,我们要想等他测试完,那么就是用done()函数,我之前介绍过的,这样测试就不通过了

import {timer} from "./timer"

// test 不通过
it("测试timer", (done) => {

  timer(()=>{
    expect(2).toBe(1)
    done();
  })

})

useFakeTimers

但是我们不能真的等3000毫秒,如果是1年呢?所以,我们Mock一个定时器

这里mock完一个定时器,一定要搭配runalltimers使用,不然也是报错的,他的意思,就是让程序巡行完所有的timers

// mock一个定时器
jest.useFakeTimers()


// 测试mock的定时器  通过
it("测试timer", () => {
    // mock一个函数
    const fn = jest.fn()
    // timer传递函数
    timer(fn)
    // 运行所有的timer
    jest.runAllTimers()
    // 测试fn的执行次数
    expect(fn).toHaveBeenCalledTimes(1)
})

那我如果有两个timers呢? 这里就会通过,因为我把toHaveBeenCalledTimes改为了2,意思是fn函数执行了2次

export const timer = (fn) => {
    setTimeout(() => {
        fn()
        setTimeout(() => {
            fn()
        }, 5000)
    }, 3000)
}


// 测试两个timer
it("测试timer", () => {
    // mock一个函数
    const fn = jest.fn()
    // timer传递函数
    timer(fn)
    // 运行所有的timer
    jest.runAllTimers()
    // 测试fn的执行次数
    expect(fn).toHaveBeenCalledTimes(2)
})

 runOnlyPendingTimers

那如果,我不想测试第二个,就想测试该用例里的第一个定时器呢?

runOnlyPendingTimers 就是告诉程序,仅运行任务队列里的定时器,也就只有第一个,第二个还没添加进去呢


// 测试两个,执行一个
it("测试timer", () => {
    // mock一个函数
    const fn = jest.fn()
    // timer传递函数
    timer(fn)
    // 运行所有的timer
    jest.runOnlyPendingTimers()
    // 测试fn的执行次数
    expect(fn).toHaveBeenCalledTimes(1)
})

advanceTimersByTime

 

 最后,如果,我想把所有的测试提前3秒呢?会执行几次fn?

这里我们写了两个定时器,时间分别为3秒和5秒,也就是说,我们执行了3秒会执行第一个定时器,再过5秒才会执行第二个定时器,但是我把时间提前3秒,那么fn会被执行一次,但是5秒

的没有执行

export const timer = (fn) => {
    setTimeout(() => {
        fn()
        setTimeout(() => {
            fn()
        }, 5000)
    }, 3000)
}


// 测试加速  通过
it("测试timer", () => {
    // mock一个函数
    const fn = jest.fn()
    // timer传递函数
    timer(fn)
    // 运行所有的timer
    jest.advanceTimersByTime(3000)
    // 测试fn的执行次数
    expect(fn).toHaveBeenCalledTimes(1)
})

有人说,不对,你试试2秒的定时器

export const timer = (fn) => {
    setTimeout(() => {
        fn()
        setTimeout(() => {
            fn()
        }, 5000)

    }, 3000)
    setTimeout(() => {
        fn()
    }, 2000)
}

 这个fn才会是两次,提前了3秒,2秒的已经执行了,3秒的也执行,所以是两次

// 测试加速  通过
it("测试timer", () => {
    // mock一个函数
    const fn = jest.fn()
    // timer传递函数
    timer(fn)
    // 运行所有的timer
    jest.advanceTimersByTime(3000)
    // 测试fn的执行次数
    expect(fn).toHaveBeenCalledTimes(2)
})

注意,这样写是一次

export const timer = (fn) => {
    setTimeout(() => {
        fn()
        setTimeout(() => {
            fn()
        }, 5000)
        setTimeout(() => {
            fn()
        }, 2000)
    }, 3000)
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据链路层(四)---PPP协议的工作状态

1 PPP链路的初始化 通过前面几章的学习,我们学了了PPP协议帧的格式以及组成,那么对于使用PPP协议的链路是怎么初始化的呢? 当用户拨号上网接入到ISP后,就建立起了一条个人用户到ISP的物理链路。这时,用户向ISP发送一…

UE5 C++ 不规则按钮识别,复选框不规则识别 UPIrregularWidgets

插件名称:UPIrregularWidgets 插件包含以下功能 你可以点击任何图片,而不仅限于矩形图片。 UPButton、UPCheckbox 基于原始的 Button、Checkbox 扩展。 复选框增加了不规则图像识别功能,复选框增加了悬停事件。 欢迎来到我的博客 记录学习过…

Latex转word(docx)或者说PDF转word 一个相对靠谱的方式

0. 前言 投文章过程中总会有各种各样的要求,其中提供word格式的手稿往往是令我头疼的一件事。尤其在多公式的文章中,其中公式转换是一个头疼的地方,还有很多图表,格式等等,想想就让人头疼欲裂。实践中摸索出一条相对靠…

Leetcode打卡:棋盘上有效移动组合的数目

执行结果:通过 题目:2056 棋盘上有效移动组合的数目 有一个 8 x 8 的棋盘,它包含 n 个棋子(棋子包括车,后和象三种)。给你一个长度为 n 的字符串数组 pieces ,其中 pieces[i] 表示第 i 个棋子的…

Day5:生信新手笔记 — R语言基本语法

一、数据类型 &#xff08;重点只有两个&#xff0c;剩下的不看&#xff09; 1.1 向量&#xff08;vector&#xff09; 矩阵&#xff08;Matrix&#xff09; 数组&#xff08;Array&#xff09; 1.2 数据框&#xff08;Data frame&#xff09; x<- c(1,2,3) #常用的向…

【Win11的Bug】无法在文件夹中创建txt文件

问题 右键只能新建文件夹 , 无法新建txt文本文档 解决办法 将注册表中的一个参数从1改为0即可. 具体内容: WinR输入regeditHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 将1改为0(下面这张图我已改过) 4.然后重新启动电脑即可 小技…

word如何快速创建目录?

文章目录 1&#xff0c;先自己写出目录的各级标题。2、选中目标标题&#xff0c;然后给它们编号3、给标题按照个人需求开始分级4、插入域构建目录。4.1、利用快捷键插入域构建目录4.2、手动插入域构建目录 听懂掌声&#xff01;学会了吗&#xff1f; 前提声明&#xff1a;我在此…

Java程序调kubernetes(k8s1.30.7)core API简单示例,并解决403权限验证问题,即何进行进行权限授权以及验证

简单记录问题 一、问题描述 希望通过Java程序使用Kubernetes提供的工具包实现对Kubernetes集群core API的调用&#xff0c;但是在高版本上遇见权限验证问题4xx。 <dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifact…

合合信息扫描全能王线下体验活动:科技与人文的完美交融

文章目录 前言签到欢迎仪式产品体验智能高清滤镜去除透字效果照片高清修复 破冰行动会议感受 前言 作为合合信息旗下扫描全能王的忠实粉丝&#xff0c;上周&#xff0c;我很荣幸参与了扫描全能王“扫出你的能量buff”快闪活动及技术交流会。这次活动的不仅让我对这款强大的文档…

【工具变量】上市公司企业所在地城市等级直辖市、副省级城市、省会城市 计划单列市(2005-2022年)

一、包含指标&#xff1a; 股票代码 股票代码 股票简称 年份 所属城市 直辖市&#xff1a;企业所在地是否属于直辖市。1是&#xff0c;0否。 副省级城市&#xff1a;企业所在地是否属于副省级城市。1是&#xff0c;0否。 省会城市&a…

Svn如何切换删除账号

记录Svn清除切换账号 1.首先打开小乌龟的设置如下图 打开设置后单击已保存数据&#xff0c;然后选择清除 接上图选择清除后&#xff0c;就可以打勾选择清除已保存的账号&#xff0c;我们再次检出的就可以切换账号了 &#x1f449;总结 本次记录Svn清除切换账号 如能帮助到你…

ASP.NET Core SignalR 入门

一、简介 &#x1f4e2; SignalR的主要功能是提供服务器和客户端之间的实时通信。当连接的客户端变得可用时&#xff0c;服务器可以立即向其推送内容&#xff0c;而不是等待客户端发起请求。这种功能特别适合需要实时更新数据的应用场景&#xff0c;如聊天应用、实时数据分析、…

分布式光伏电站如何实现监控及集中运维管理?

安科瑞戴婷 Acrel-Fanny 前言 今年以来&#xff0c;在政策利好推动下光伏、风力发电、电化学储能及抽水蓄能等新能源行业发展迅速&#xff0c;装机容量均大幅度增长&#xff0c;新能源发电已经成为新型电力系统重要的组成部分&#xff0c;同时这也导致新型电力系统比传统的电…

2022-12-4----Android11(H713m)---- WiFi驱动添加写入mac号补丁

一、问题 用全志的写号工具&#xff0c;写入wifi_mac&#xff0c;设置下边不生效 二、分析 因为我们的WiFi不是用全志平台的&#xff0c;也不是用全志集成好的&#xff0c;而是用希微这家第三方的WiFi/BT&#xff0c;所以该驱动还没完善。 三、修改前的准备 用写号工具写号…

Linux笔记---进程:进程替换

1. 进程替换的概念 进程替换是指在一个正在运行的进程中&#xff0c;用一个新的程序替换当前进程的代码和数据&#xff0c;使得进程开始执行新的程序&#xff0c;而不是原来的程序。 这种技术通常用于在不创建新进程的情况下&#xff0c;改变进程的行为。 我们之前谈到过for…

Linux 权限管理:用户分类、权限解读与常见问题剖析

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; &#x1f6a9;用通俗易懂且不失专业性的文字&#xff0c;讲解计算机领域那些看似枯燥的知识点&#x1f6a9; 目录 &#x1f4af;L…

【开源】A060-基于Spring Boot的游戏交易系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

rabbitmq 安装延时队列插件rabbitmq_delayer_message_exchange(linux centOS 7)

1.插件版本 插件地址&#xff1a;Community Plugins | RabbitMQ rabbitmq插件需要对应的版本&#xff0c;根据插件地址找到插件 rabbitmq_delayer_message_exchange 点击Releases 因为我rabbitmq客户端显示的版本是&#xff1a; 所以我选择插件版本是&#xff1a; 下载 .ez文…

elementui table滚动分页加载

文章目录 概要 简化的实现示例&#xff1a; 小结 概要 在使用 Element UI 的 Table 组件时&#xff0c;如果需要实现滚动分页加载的功能&#xff0c;可以通过监听 Table 的滚动事件来动态加载更多数据。 简化的实现示例&#xff1a; <template><el-table ref"…

书生浦语第四期--基础岛-第五关

文章目录 学习使用Xtuner微调大模型开始微调检查hf文件夹检查meraged文件夹启用WebUI 对话查看效果 学习使用Xtuner微调大模型 开始微调 检查hf文件夹 检查meraged文件夹 启用WebUI 对话 查看效果