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

React 组件测试技巧

; }); --- 数据获取 {#data-fetching} 你可以使用数据来 mock 请求,而不是在所有测试调用真正的 API。...// 清理 mock 以确保测试完全隔离 global.fetch.mockRestore(); }); --- mock 模块 {#mocking-modules} 有些模块可能在测试环境不能很好地工作...注意: React 测试库为触发事件提供了一个更简洁的助手。 --- 计时器 {#timers} 你的代码可能会使用基于计时器的函数(如 setTimeout)来安排将来更多的工作。...MouseEvent("click", { bubbles: true })); }); expect(onSelect).toHaveBeenCalledWith(2); }); 你只能在某些测试中使用计时器...在上面,我们通过调用 jest.useFakeTimers() 来启用它们。它们提供的主要优势是,你的测试实际上不需要等待 5 秒来执行,而且你也不需要为了测试而使组件代码更加复杂。

4.9K00

使用Jest测试包含setTimeout调用的函数踩坑记录

虽然从错误信息我们知道可以通过jest.setTimeout来修改这个默认超时时间,但这个测试用例实际运行的时候也的确需要等待6s,如果我们有什么测试用例需要等待几分钟甚至几小时,那总不能在CI上卡个几小时等待用例通过吧...于是,搜索一番之后,我发现Jest提供了计时器、也即fake timer相关API。 通过jest.useFakeTimers()即可对当前文件启用fake timer。...启用fake timer的时候,setTimeout、setInterval都会使用Jest提供的实现,他们不会真正阻塞住测试用例。...相应地,Jest还提供了advanceTimersByTime函数,可以将Jest运行测试用例时的时钟向前拨动,并“按时”运行之前通过setTimeout、setInterval传入的回调。...问题解决 稍微思考一下,我们会发现原来的测试用例是有问题的:不论是使用真时钟还是时钟,调用enqueueJob后将时间向前拨3s,并不能证明任务真的恰好在3s后执行了,只能证明3s内执行了,enqueueJob

6.6K60
您找到你想要的搜索结果了吗?
是的
没有找到

使用 Jest 进行前端单元测试

Mock Jest 自带一个 mock 系统,并支持自动和手动 mock。 通常项目中,要测试的文件可能带有很多调用依赖,另外单元测试环境和真实环境可也能存在差异,使得脱离真实环境不能直接运行。...Timer 业务代码如果有 setTimeout 这样的计时器测试过程如果真实的去执行,可能会严重拖慢整个测试项目的执行时间,设想一个功能有 n 个用例去测试,延时就会被重复 n 倍。...例如使用 jest.useFakeTimers() 把遇到的计时器挂起,必要时再使用 jest.runOnlyPendingTimers() 执行掉已经挂起的计时器。... Jest 也不用像 mocha 那样通过执行 done 来通知异步结束,而是直接返回 Promise 和 async/await 就好。...,两次类似的 fetch 调用使得需要在 mock 对不同参数做判断。

5.5K90

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

下面会根据各种场景进行分析 二、异步函数 我们实际开发我们会遇到很多异步函数,但是因为Jest进行测试时,默认情况下一旦到达运行上下文底部当前测试立即结束,这样意味着测试将不能按照我们的预期进行,...我们难免会遇到使用setTimeout\setInterval,刚刚在异步用例wait函数其实就是通过setTimeout进行包装的,这个示例我们重点分析应该如何测试定时器。.../src/example3' describe('setTimeout timeout', () => { it('setTimeoutFunc', async () => { // 启动的定时器...这意味着模块模拟不会包装原始模块,它会完全替换require系统的原始模块。因此,mockRestore可以模拟模块的模拟函数上定义,但是调用它不会恢复原始实现。...我们开始前对window.bridage进行模拟保证每个用例能正确获取它。

10.2K20

你可能不知道的setInterval的坑

setInterval不能确保每次调用都能执行。...当然,其实setTimeout也有这个问题。浏览器的定时器都不是精确执行的。就算你调用setTimeout(fn, 0),它也不能确保马上执行。...1000); } fn(); 可是使用setTimeout后,我们又可能会遇到一个问题,就是计时器的下次触发时间是在当前的触发时间上开始计算的。...这对于第二个坑这种情况是合理的,可是有时候我们又希望它能“匀速”地被触发。也就是说,希望计时器触发时间尽可能在计时器注册时间+周期*delay附近。...之后每次调用newFn的时候,都会使用预期下次发生的时间减去当前的时间来得到一个精确的delayTime。这样至少可以保证一些情况下,计时器可以稍微精确的执行。

1.8K20

【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门

---- 单元测试 单元测试其实在我的实际开发并没有用到过,但却经常听说,接下来进行单元测试的学习 Jest 和 Vue Test Utils 的基础和进阶全覆盖 TDD,测试驱动开发,一种全新的开发方式...插件,那么可以实时并且直观的看到测试是否通过 Jest 实现异步测试 回调方式 // callback const fetchUser = (cb) => { setTimeout(() =>..., cb) { if (shouldCall) { return cb(42) } } it('test with mock function', () => { // 创建一个的函数实现.../user') // 先引入 axios 这个模块 const axios = require('axios') // 调用 jest.mock 接管 axios 模块 jest.mock("axios...jest.runAllTimers() // 是否被调用 expect(callback).toHaveBeenCalled() // 调用的参数 expect(callback)

1.3K20

防抖与节流 & 若每个请求必须发送,如何平滑地获取最后一个接口返回的数据

博客地址:https://ainyi.com/79 日常浏览网页进行窗口的 resize、scroll 或者重复点击某按钮发送请求,此时事件处理函数或者接口调用的频率若无限制,则会加重浏览器的负担...原理是维护一个计时器,规定在 delay 时间后触发函数,但是 delay 时间内再次触发的话,就会取消之前的计时器而重新设置。...原理是通过判断是否到达一定时间来触发函数 区别: 函数节流不管事件触发有多频繁,都会保证规定时间内一定会执行一次真正的事件处理函数,而函数防抖只是连续触发的事件后才触发最后一次事件的函数 上面的解释...尤其是购买数量,这是一个数字选择器,如果用户频繁点击 + 号,就会连续调用多次查价接口,但==最后一次的查价接口返回的数据才是最后选择的正确的价格== 每个查价接口逐个请求完毕的时候,==右边的显示价格也会逐个改变...==,最终变成最后正确的价格,一般来说,这是比较不友好的,用户点了多次后,不想看到价格变化,尽管最终是正确的价格,但这个变化的过程是不能接受的 也不应该使用上面的防抖解决方式,不能设置过长的定时器,因为查价接口不能等太久

3.2K50

关于JavaScript计时器的知识学习

定时器由浏览器实现,不同浏览器的实现也会有所不同,Node.js 也实现了自己的定时器。 浏览器,主计时器函数是 Window 接口的一部分,它具有一些其他函数和对象。...然后我两个 setTimeout 调用中使用了 theOneFunc ,一个 4 秒后触发,另一个 8 秒后触发。...约束:您不能对此挑战使用 setTimeout 调用。提示:你需要一个计数器。...你不能使用 let 或 var。 解答 因为延迟量是此挑战的变量,所以我们不能在这里使用 setInterval ,但我们可以递归调用中使用 setTimeout 手动创建间隔执行。...另外,因为我们不能使用 let / var,所以我们不能有一个计数器来增加每个递归调用的延迟,但我们可以使用递归函数参数递归调用期间递增。

1.6K40

web前端好帮手 - Jest单元测试工具

,默认等待时间是5秒,如果异步操作时长超过,我们需要通过jest.setTimeout设置等待时长。...1000ms timeout specified by jest.setTimeout.test("超时", async () => { jest.setTimeout(1000); await...nodeJson = renderInstance.toJSON(); // ... }); 这是因为react-test-renderer渲染和服务端渲染类似,渲染只会执行一次,即使渲染过程触发数据状态变动...测试覆盖率统计 Jest自带测试覆盖率功能,jest.config.js配置文件开启即可: // jest.config.jsmodule.export = { // ......比如全民K歌前端这边,我们希望逐步的覆盖业务公共代码的测试,并且要求经过测试的文件覆盖率100%,日后新增代码功能时,已测试文件的覆盖率不能下降(即要求新增功能同时新增对应的测试),我们可以这样设置jest.config.js

4.9K40

jest 单元测试改善老旧的 Backbone.js 项目

url 前缀 可以发现 model 依赖了以个全局变量的属性 _appFacade.ajaxPrefix 首先编写一个的全局对象: // __test__/fakeAppFacade.jsvar...另一个难点在于,Backbone.View 的 constructor / initialize “构造函数”,并不能接受自定义的 props 参数。...$el.find('.multi').length).toEqual(0); }); 对方法调用的测试 自然还是用 sinon 来做: it('应正确响应事件回调并加载子模板', function()...jest.doMock() 方法,其缺点是用了这个就不能用 ES6 的 import 语法了,配置和使用简要说明如下: // jest.config.jsmoduleNameMapper: { "...灵活的配置能力,使其能方便的应用于各种类型既有项目的 TDD 开发和重构 之前的其他测试框架下的用例,可以快速迁移到 jest Backbone.View 视图组件经过 ES6 升级和合理封装后

3.4K10

前端自动化测试实践03—jest异步处理&mock

,前端自动化测试,一般需要 mock 触发的 ajax 请求,例如测试 mock.js 接口调用 export const getData = () => { return axios.get...: true,程序会自动 mocks 文件夹下找同名文件,省去了手动调用 jest.mock('..../mock'); 4. mock - function 模拟函数调用 对于单元测试,无需关心外部传入的函数的实现,使用 jest.fn 生成一个 mock 函数,可以捕获函数的调用和返回结果,以及this.../mock' test('测试 callback', () => { // 【1】使用 jest 生成一个 mock 函数 func1,用来捕获函数调用 const func1 = jest.fn.../es6-class', () => {const Util = jest.fn() ... }) 【3】 __mocks__ 编写同名文件覆盖 __mocks__ 文件除了可以替换 ajax 请求

5K85

前端-用 Vue 编写一个长按指令

如何实现 当用户点击按钮时,点击事件之前会触发另外两个事件: mousedown 和 mouseup。 当用户按下按钮时触发 mousedown 事件,用户松开按钮时调用 mouseup 事件。...我们需要做的是: mousedown 事件触发时,启动计时器。 一旦 mouseup 事件预期的 2 秒前被触发,就清除计时器,不要执行相应的函数。就当作一个普通的点击事件。...启动函数 这个函数包括一个 setTimeout,它是 JavaScript 的一个基本方法,允许特定时间之后执行一个函数。 注意,click 事件执行的过程,会触发另外两个事件。...要取消 setTimeout ,可以使用 JavaScript 的 clearTimeout 方法,它主要用来清除 setTimeout() 方法设置的计时器。...== null) { clearTimeout(pressTimer) pressTimer = null } } 一旦 mouseup 事件触发,这个函数就会被调用

2.2K40

Javascript 面试中经常被问到的三个问题!

相反,讨论 JavaScript 时,面试通常会提到三件事。我自己也被问到这些问题,我的朋友们告诉我他们也被问到这些问题。...经常不正确的写法是这样的: const arr = [10, 12, 15, 21]; for (var i = 0; i < arr.length; i++) { setTimeout(function...实际上有多处方法来正确的解这道题: const arr = [10, 12, 15, 21]; for (var i = 0; i < arr.length; i++) { setTimeout(...总结下来,所谓的“节流”,是通过一段时间内无视后来产生的回调请求来实现的。只要 裁判宣布比赛开始,裁判就会开启计时器,在这段时间内,参赛者就尽管不断的吃,谁也无法知道最终结果。...对应到实际的交互上是一样一样的:每当用户触发了一次 scroll 事件,我们就为这个触发操作开启计时器

85620

常见的三个 JS 面试题

相反,讨论 JavaScript 时,面试通常会提到三件事。我自己也被问到这些问题,我的朋友们告诉我他们也被问到这些问题。...经常不正确的写法是这样的: const arr = [10, 12, 15, 21]; for (var i = 0; i < arr.length; i++) { setTimeout(function...实际上有多处方法来正确的解这道题: const arr = [10, 12, 15, 21]; for (var i = 0; i < arr.length; i++) { setTimeout(...总结下来,所谓的“节流”,是通过一段时间内无视后来产生的回调请求来实现的。只要 裁判宣布比赛开始,裁判就会开启计时器,在这段时间内,参赛者就尽管不断的吃,谁也无法知道最终结果。...对应到实际的交互上是一样一样的:每当用户触发了一次 scroll 事件,我们就为这个触发操作开启计时器

1.2K20

单元测试

需求业务逻辑变更太快的需求 做单测(Props 以及 Render 交互),推荐单测之前已评审过测试用例 公共类 公共组件 公共方法 公共自定义hook 需求功能类 组件的Props(组件的入参是否正确的场景或时机被正确的使用或调用...jest-location-mock 用于 Jest 测试模拟浏览器window.location对象的库。...,会出现报错 这种情况通常是由于一组测试用例,前一个测试用例没有正确地清理或重置测试环境,导致后续的测试无法找到期望的元素或状态。...{ render, screen, act } from '@testing-library/react'; act 是一个用于处理 React 组件的异步更新和副作用的工具函数,它的主要作用是确保测试中正确触发和等待组件更新...因此,callback 可在不确定的时间和频率(间隔以及 DOM 变化时调用)被调用(或者检查错误)。所以这也意味着你的副作用可能会被多次调用

15910
领券