首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用Jest模拟递归函数中的promises和计时器

Jest是一个流行的JavaScript测试框架,用于编写和运行单元测试。它提供了丰富的API和工具,可以模拟各种场景,包括递归函数中的promises和计时器。

递归函数是一种在函数内部调用自身的技术。当递归函数中涉及到异步操作,比如promises和计时器,我们可以使用Jest的模拟功能来测试这些异步操作的行为。

在Jest中,我们可以使用jest.mock()函数来模拟递归函数中的promises和计时器。这个函数接受两个参数:模块名称和模拟实现。我们可以使用jest.fn()来创建一个模拟函数,然后将其作为模拟实现传递给jest.mock()函数。

下面是一个示例,演示如何使用Jest模拟递归函数中的promises和计时器:

代码语言:txt
复制
// 递归函数
async function recursiveFunction(n) {
  if (n <= 0) {
    return Promise.resolve('Done');
  }

  return new Promise((resolve) => {
    setTimeout(async () => {
      const result = await recursiveFunction(n - 1);
      resolve(result);
    }, 1000);
  });
}

// 测试递归函数
test('recursiveFunction', async () => {
  jest.useFakeTimers(); // 使用Jest的计时器模拟功能

  const mockRecursiveFunction = jest.fn(); // 创建模拟函数
  mockRecursiveFunction.mockResolvedValueOnce('Done'); // 设置模拟函数的返回值

  const result = await recursiveFunction(3);

  expect(mockRecursiveFunction).toHaveBeenCalledTimes(3); // 检查模拟函数被调用的次数
  expect(setTimeout).toHaveBeenCalledTimes(3); // 检查计时器被调用的次数
  expect(result).toBe('Done'); // 检查递归函数的返回值

  jest.useRealTimers(); // 恢复真实的计时器
});

在上面的示例中,我们使用jest.useFakeTimers()函数来启用Jest的计时器模拟功能。然后,我们创建了一个模拟函数mockRecursiveFunction,并使用mockResolvedValueOnce()方法设置了模拟函数的返回值。接下来,我们调用递归函数recursiveFunction(3),并使用await关键字等待其返回结果。最后,我们使用各种断言来验证模拟函数和计时器的调用情况,以及递归函数的返回值。最后,我们使用jest.useRealTimers()函数恢复真实的计时器。

这是一个简单的示例,演示了如何使用Jest模拟递归函数中的promises和计时器。根据具体的业务需求和测试场景,你可以进一步扩展和优化这个示例。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

从echarts-for-react源码中学习如何写单元测试

前言 如果你熟悉ReactEcharts的话,应该有用到过 echarts-for-react(虽然它现在没有维护了),本文就通过它写测试用例来学习下如何写单元测试 如何测试function 有如下函数...,作用是「浅复制objkeys」,如何判断它返回是期待结果?.../src/utils'; // 把遇到计时器挂起,在必要时,再使用jest.runOnlyPendingTimers执行掉已经挂起计时器 jest.useFakeTimers(); // 描述块,将多个...() 作用: 把遇到计时器挂起,在必要时,再使用jest.runOnlyPendingTimers执行掉已经挂起计时器 这里使用jest.useFakeTimers()目的就是暂停正在执行timer...()/shallow()/render()区别如下: [1] mount()借助jsdom模拟浏览器环境,并提供DOM api生命周期支持,方便测试HOC(高阶组件) [2] shallow()

6.2K50

使用 Jest 进行前端单元测试

我们只要稍作加工,就可以指定各个文件行为,并模拟我们想要情况来进行不同测试,例如本例控制 fetchUser 返回。...Timer 业务代码如果有 setTimeout 这样计时器,在测试过程如果真实去执行,可能会严重拖慢整个测试项目的执行时间,设想一个功能有 n 个例去测试,延时就会被重复 n 倍。...例如使用 jest.useFakeTimers() 把遇到计时器挂起,在必要时再使用 jest.runOnlyPendingTimers() 执行掉已经挂起计时器。...,不同测试文件是分开独立执行,如果担心各种 mock unmock 在不同测试用例之间造成冲突,可以按照分类把例分开放到不同文件内。...最后总结一下,编写可测试代码,其实可以遵循这几个点来规范: 功能最小化,单一职责函数 抽离业务逻辑公共部分 细分文件依赖 避免函数副作用(不修改实参) 其他还有很多可以优化点不再阐述,感兴趣推荐阅读一下

5.6K90
  • 使用Jest测试包含setTimeout调用函数踩坑记录

    而对于Promise实现,一个Promise对象创建时传入回调函数F会被立刻执行,但thencatch传入回调会被加入到队列,在下一轮Tick时才执行(即使F中立刻resolve或reject...虽然从错误信息我们知道可以通过jest.setTimeout来修改这个默认超时时间,但这个测试用例在实际运行时候也的确需要等待6s,如果我们有什么测试用例需要等待几分钟甚至几小时,那总不能在CI上卡个几小时等待例通过吧...根据Jest官方文档,调用这个函数后,所有队列“微任务”都会被立刻执行,这里目的就是保证catch回调能被立刻调用; 使用jest.advanceTimersByTime(6000)代替await...在Jestissue列表,我搜到了这样一条issue: Promises use their own micro-queue for resolution, which Jest has no control...断言通过后,我们再手动调用传入回调函数模拟6s已经经过场景。

    6.8K60

    React Native单元测试

    概述 所谓单元测试,就是对每个单元进行测试,一般针对函数、类或单个组件,不涉及系统集成,单元测试是软件测试基础测试,一个完备软件系统都会涉及到单元测试。...目前,Javascript测试工具很多,但是针对React测试主要使用是Facebook推出Jest框架,Jest是基于JasmineJavaScript测试框架,具有上手容易、快速、可靠特点...相比其他测试框架,Jest具有如下一些特点: 适应性:Jest是模块化、可扩展可配置; 沙箱快速:Jest虚拟化了JavaScript环境,能模拟浏览器,并且并行执行; 快照测试:Jest能够对...React 树进行快照或别的序列化数值快速编写测试,提供快速更新用户体验; 支持异步代码测试:支持promisesasync/await; 自动生成静态分析结果:不仅显示测试用例执行结果,也显示语句...、分支、函数等覆盖率。

    91920

    2018-7-18pythoh函数参数,返回值,变量,递归

    *****************************************************************                                  函数参数初级返回值...: 技术文档[]方括号里面的东西表示可选 参数:函数运行需要数据   如果没有参数会提示:missing 1 required positional, 函数两个要点,参数返回值: 1.如果函数有参数在调用执行函数时候要把参数写里面...,函数递归比循环消耗内存 在函数尽量定义局部变量 开发一个项目一般把项目分成三个部分,分别是: data.py(存放数据文件) tools.py(存放函数文件) main.py(存放函数执行文件...: 定义一个函数表示 一个行为 #在一个函数可以调用另一个函数,叫做函数相互调用 #在函数也可以调用自己叫做函数递归 #第一种:两个行为是相互独立 # def movie(): #    ...#     snack() #admiad # def snack(): #     print("吃零食") # # movie() #函数递归就是函数调用执行自己,简单函数递归实例

    2.1K40

    前端单元测试之Jest

    前端测试框架有很多:mocha, jasmine, ava, testcafe, jest,他们都有各自擅长领域特点,而我们采用jest框架具有如下一些特点: 适应性:Jest是模块化、可扩展可配置...; 沙箱快速:Jest虚拟化了JavaScript环境,能模拟浏览器,并且并行执行; 快照测试:Jest能够对React 树进行快照或别的序列化数值快速编写测试,提供快速更新用户体验; 支持异步代码测试...:支持promisesasync/await; 自动生成静态分析结果:不仅显示测试用例执行结果,也显示语句、分支、函数等覆盖率。...Mock函数通常会提供以下三种特性: 捕获函数调用情况; 设置函数返回值; 改变函数内部实现; jest.fn() jest.fn()是创建Mock函数最简单方式,如果没有定义函数内部实现,jest.fn...当有异步方式运行代码时候,Jest需要知道当前它测试代码是否已经完成,然后它才可以转移动另一个测试,也就是说,测试例一定要在测试对象结束之后才能够运行。

    2.7K20

    Jest单元测试之旅—实践总结

    我们难免会遇到使用setTimeout\setInterval,刚刚在异步wait函数其实就是通过setTimeout进行包装,这个示例我们重点分析应该如何测试定时器。...每个方法都有不同使用场景,每个API都会生成一个mock模拟函数Jest模拟函数提供了很多方法给予我们模拟方法返回、实现等等,可移至文档参考 jest.fn jest.fn主要是创建一个模拟函数...这意味着模块模拟不会包装原始模块,它会完全替换require系统原始模块。因此,mockRestore可以在模拟模块模拟函数上定义,但是调用它不会恢复原始实现。...这里分别使用了jest.spyOnjest.Mock两个方式对同一个方法进行3种不同编写方式测试,在实际情况我们应该选择合适方法。...模拟部分函数,这里使用了jest.requireActual,该方法主要是绕过模拟模块导出真实模块,然后通过jest.mock工厂函数重新去定义该模拟模块内容,这种方式就可以指定导出模块具体哪些方法需要被模拟

    10.3K20

    2024 年必会 10 个 Node.js 新特性,你还不知道就太落伍了!

    使用 node:test 运行单个测试 要创建一个测试,可以使用 test 函数,传入测试名称回调函数。在回调函数定义你测试逻辑。...Jest 修改全局对象,可能导致测试出现意外行为。 instanceof 操作符在 Jest 不总是按预期工作。 Jest 增加了项目的依赖负担,使得维护第三方依赖管理安全问题更加困难。...在需要避免在测试运行实际代码(如 HTTP 请求或文件系统 API)时,它们非常有用,可以存根模拟来替代这些操作,并在稍后进行检查。...这个函数使用了 Node.js 原生文件系统 API fs。 现在,我们看看如何使用 Node.js 原生模拟功能来测试这个函数。...通过 Node.js 原生模拟功能,我们可以有效地将 loadEnv 函数与文件系统隔离,进行独立测试。Node.js 20 模拟功能还支持模拟定时器。 什么是 Mock?

    50710

    那些年错过React组件单元测试(上)

    通过第一个测试用例加 1,number值为 1,当第二个例减 1 时候,结果应该是 0。但是这样两个例间相互干扰不好,可以通过 Jest 钩子函数来解决。...在单元测试,我们可能并不需要关心内部调用方法执行过程结果,只想知道它是否被正确调用即可,甚至会指定该函数返回值。这个时候,mock意义就很大了。...我们在测试也主要是用到了mock函数提供以下三种特性: 捕获函数调用情况 设置函数返回值 改变函数内部实现 下面,我将分别介绍这三种方法以及他们在实际测试应用。...实际上,jest.spyOn()是jest.fn()语法糖,它创建了一个被spy函数具有相同内部代码mock函数。 Snapshot 快照测试 所谓snapshot,即快照也。...总结 到这里,关于前端单元测试一些基础背景Jest基础api就介绍完了,在下一篇文章,我会结合项目中一个React组件来讲解如何做组件单元测试。 ?

    5K20

    前端高频手写面试题

    => 递归递归退出条件:被比较是两个值类型变量,直接“===”判断被比较两个变量之一为null,直接判断另一个元素是否也为null提前结束递推:两个变量keys数量不同传入两个参数是同一个变量递推工作...,这点===更为相似,他们之间也存在一些区别NaN在===是不相等,而在Object.is是相等+0-0在===是相等,而在Object.is是不相等Object.is = function...图片像dom拖拽,如果消抖的话,就会出现卡顿感觉,因为只在停止时候执行了一次,这个时候就应该用节流,在一定时间内多次执行,会流畅很多手写简版使用时间戳节流函数会在第一次触发事件时立即执行,以后每过...原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前计时器而重新设置。这样一来,只有最后一次操作能被触发。函数节流 :使得一定时间内只触发一次函数。...因为 Promise 状态只能改变一次, 那么我们只需要把 Promise.race 中产生 Promise 对象 resolve 方法, 注入到数组每一个 Promise 实例回调函数即可

    1.1K20

    React 组件测试技巧

    在测试环境页面阅读更多关于设置测试环境细节。 在这个页面上,我们将主要使用函数组件。然而,这些测试策略并不依赖于实现细节,它对于 class 组件也同样有效。...常见方法是使用一对 beforeEach afterEach 块,以便它们一直运行,并隔离测试本身造成影响: import { unmountComponentAtNode } from "react-dom...这些示例其余部分使用 act() 来作出这些保证。 你可能会发现直接使用 act() 有点过于冗长。为了避免一些样板代码,你可以使用 React 测试库,它助手是 act() 封装。...注意: React 测试库为触发事件提供了一个更简洁助手。 --- 计时器 {#timers} 你代码可能会使用基于计时器函数(如 setTimeout)来安排将来更多工作。...计时器 mock 为这个组件编写测试,并测试它可能处于不同状态。

    4.9K00

    Jest 单元测试快速上手指南

    你可以完善测试用例, 或者可能有些文件(譬如 config)代码分支并不需要测试, 可以将其在测试覆盖率结果中排除, 参考如下配置 忽略目录下所有文件 在 jest.config.js 添加 collectCoverageFrom...开头表示忽略与其匹配文件 忽略单个文件 在该文件顶部添加 /* istanbul ignore file */ 忽略一个函数, 一块分支逻辑或者一行代码 在该函数, 分支逻辑或者代码行上一行添加...执行单测时不校验 ts 类型 有时你可能会希望不校验 ts 类型, 仅执行代码测试, 比如需要在 CI 中将类型校验单元测试分为两个任务 在 jest.config.js 添加如下内容 globals...linaria 是通过 babel 插件将其预编译为 class 名, 这里可以 mock 一下 css 函数, 返回一个随机值作为 class 名 在根目录创建 jest.setup.js jest.mock.../ 让计时器前进 1000ms expect(timer()).toBe(''); }) }) mock 依赖模块 要测试模块可能依赖于其他模块或者第三方 npm 包结果,

    3.4K30

    Jest:给你 React 项目加上单元测试

    单元测试(Unit Testing),指的是对程序模块(最小单位)进行检查验证。比如一个函数、一个类、一个组件,它们都是模块。 使用单元测试优点: 更好地交付高质量代码。...Jest 基本使用 我们先写一个简单函数,作为被测试模块。...function sum(a, b) { return a + b; } export default sum; 然后我们 Jest 来做测试。 import sum from '....; toContain:数组是否含有某个元素; toBeLessThan:是否小于某个值,可以做性能测试,执行某个函数几千次,时间不能高于某个值。...React Testing Library 是 以用户为角度 测试库,能够模拟浏览器 DOM,将 React 组件挂载上去后,我们使用其提供一些模拟用户操作 API 进行测试。

    2.9K20

    【架构师(第二十九篇)】Vue-Test-Utils 触发事件异步请求

    ---- 知识点 将 mock 对象断言为特定类型 使用 jest.Mocked 使用 it.only 来指定测试 case 使用 skip 跳过指定测试 case 测试内容 触发事件...trigger 方法 测试界面是否更新 特别注意 DOM 更新是个异步过程 使用 async await 更新表单 setValue 方法 验证事件是否发送 emitted 方法 测试异步请求 模拟第三方库实现...测试准备结束 可以使用内置一些钩子来简化一些通用逻辑,以下钩子用于一次性完成测试准备。...}); }); afterEach(() => { mockAxios.get.mockReset(); }); }); 测试建议 如果一个测试失败了,需要注意 它是否是唯一在运行例...,使用 only 单独运行一次 如果单独运行没问题,整体运行出错,应该检查 beforeEach ,beforeAll 等全局钩子逻辑是否有问题,判断是否需要清空共享状态。

    88210
    领券