首页
学习
活动
专区
圈层
工具
发布

使用 React Testing Library 的 15 个常见错误

以前的我(Kent)并不是很喜欢那个时候的测试环境,为此写了一个 React Testing Library。...接下来,我就一一盘点这些方法,解释为什么它们不是很好,以及如何改进测试以避免这些陷阱。 注:下面是重要程度的说明。...低:一般为我的主观想法,如果你觉得使用上没啥问题可以忽略它 中:如果你不遵循,可能会出现 Bugs、低效的测试用例、还可能会做额外的工作 高:一定要用我建议的方法。...不过,你应该避免使用它们(因为我实在想不出使用它们的现实场景,除非你是在处理一些历史遗留问题)。 你也可以直接调 screen.debug 而不是 debug。...也因为这点,断言是永远不可能失败的(因为如果找不到元素,查询在断言之前抛出异常)。 因为这个原因,很多人直接不做断言了。

1.8K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    然后我翻阅了大量的文档,发现基于dva的单元测试文档比较少,因此在有了一番实践之后,我梳理了几篇文章,希望对于想使用 Jest 进行 React + Dva + Antd 单元测试的你能有所帮助。...前端自动化测试产生的背景 在开始介绍jest之前,我想有必要简单阐述一下关于前端单元测试的一些基础信息。 为什么要进行测试?...、Mock、Snapshot 快照测试等,这些我们会在下面 React 的单元测试示例中依次讲解。...我们在测试中也主要是用到了mock函数提供的以下三种特性: 捕获函数调用情况 设置函数返回值 改变函数的内部实现 下面,我将分别介绍这三种方法以及他们在实际测试中的应用。...当我们再次运行快照测试时,Jest 会将新的快照与旧的快照进行比较,如果两者不一致,测试就会失败,从而帮助我们确保用户界面不会发生意外改变。 ?

    6.5K20

    如何实现比 setTimeout 快 80 倍的定时器?

    这样,执行时机类似,但是延迟更小的定时器就完成了。 再利用上面的嵌套定时器的例子来跑一下测试: 全部在 0.1 ~ 0.3 毫秒级别,而且不会随着嵌套层数的增多而增加延迟。...直接放结论,这个差距不固定,在我的 mac 上用无痕模式排除插件等因素的干扰后,以计数到 100 为例,大概有 80 ~ 100 倍的时间差距。在我硬件更好的台式机上,甚至能到 200 倍以上。...借用 React Scheduler 为什么使用 MessageChannel 实现 这篇文章中的一段伪代码: const channel = new MessageChannel(); const port...参考我的这篇对 EventLoop 规范的解读 深入解析 EventLoop 和浏览器渲染、帧动画、空闲回调的关系,关键的原因在于微任务会在渲染之前执行,这样就算浏览器有紧急的渲染任务,也得等微任务执行完才能渲染...postMessage 定时器在 React 时间切片中的运用。 为什么时间切片需要用宏任务,而不是微任务

    45240

    SolidJS硬气的说:我比React还react

    大家好,我是卡颂。 最近刷推时,有个老哥经常出现在「前端框架」相关推文下。 ? 一副憨厚的样貌 我想:“老哥你哪位?” 一查,原来是个框架作者,作品叫SolidJS[1]。 ?...更快的更新速度 我们知道,在React与Vue中存在一层「虚拟DOM」(React中叫Fiber树)。...那我问你个问题: 为什么Hooks会有调用顺序不能变的要求? 为什么useEffect回调会有闭包问题? 答案已经呼之欲出了:React只有在这些限制下才能实现「响应式」。...辛劳苦干React 有一个可能反直觉的知识:React并不关心哪个组件触发了更新。 在React中,任何一个组件触发更新(如调用this.setState),所有组件都会重新走一遍流程。...因为需要构建一棵新的Fiber树。 为了减少无意义的render,React内部有些优化策略用来判断组件是否可以复用上次更新的Fiber节点(从而跳过render)。

    2.1K30

    函数组件 和 函数式编程 有关系么?

    大家好,我卡颂。...为了实现这套理念,吸收了哪些编程范式中的思想 这些思想如何在React中落地 如果我们用上述思考过程研究「函数组件与函数式编程的关系」,会发现: 函数组件属于落地的产物(上述思考的第三步) 函数式编程属于编程范式...这里面的闭包就是OOP思想中的实例。 既然React对「函数映射」的载体没有特殊要求,那么类组件、函数组件都是可以的。 那为什么函数组件最终替代了类组件成为React开发的主流呢?...在React中,快照主要包括三类数据: state props context 对于同一个组件,根据公式UI = fn(snapshot),相同的快照输入应该获得相同输出(JSX)。...每次render,React都会保证上次的副作用效果已经被清除(通过useEffect回调的返回值函数) ref的传播也需要借由forwardRef,这进一步限制了ref可能的影响范围 数据请求的副作用被交给

    48910

    JavaScript 测试教程–part 3:测试 props,挂载函数和快照测试

    JavaScript测试教程–part 4:模拟 API 调用和模拟 React 组件交互 在上一篇教程中,我介绍了使用 Enzyme 测试 React 组件的基础知识。...今天,将进行更深入的研究,并学习如何测试 props,如何(以及为什么)使用 mount 函数以及什么是快照测试。开始吧! 测试 props 在上一篇文章中,我们测试了通过一些 props 的结果。...前面失败的测试现在将会通过。 由于 mount 函数可渲染更多内容并模仿实际的 DOM,所以测试将会花费更多时间。使用 mount 函数可能意味着你是在进行单元测试,而现在在进行集成测试。...在测试期间,将渲染组件并创建其快照。它包含渲染组件的整个结构,应该与测试本身一起提交给存储库。再次运行快照测试时,新的快照将与旧的进行比较。如果它们不同,则测试将失败。...摘要 在本文中,我们介绍了对组件的 props 进行测试的过程,并了解了 mount 函数和 浅渲染 之间的区别。除此之外,我们还介绍了快照测试,它是跟踪组件渲染方式变化的有用工具。

    2.2K20

    探究React的渲染

    首先React会为需要渲染的部件创建快照,这个快照包含属性、状态、事件处理函数,以及UI的描述。 为了得到你的应用的初始UI,React需要做初始的渲染,这个初始渲染发生在root上。...然后它注意到新的状态0和快照中的状态0是一样的。因此React没有触发重新渲染,快照和视图保持不变。...const handleClick = () => { setCount(1) setCount(2) setCount((c) => c + 3) } 在这个例子中c将是2,因为这是在回调函数运行之前传递给...毕竟如果React真的只有在绝对必要的时候才会重新渲染,为什么Wave会重新渲染,因为它不接受任何props,也没有任何state。...任何时候一个React组件的渲染,不管它为什么或位于组件树的什么位置,React都会创建一个组件的快照,它捕捉到React在那个特定时刻更新视图所需要的一切。

    1.3K30

    如何实现比 setTimeout 快 80 倍的定时器?

    这样,执行时机类似,但是延迟更小的定时器就完成了。 再利用上面的嵌套定时器的例子来跑一下测试: ? 全部在 0.1 ~ 0.3 毫秒级别,而且不会随着嵌套层数的增多而增加延迟。...直接放结论,这个差距不固定,在我的 mac 上用无痕模式排除插件等因素的干扰后,以计数到 100 为例,大概有 80 ~ 100 倍的时间差距。在我硬件更好的台式机上,甚至能到 200 倍以上。 ?...借用 React Scheduler 为什么使用 MessageChannel 实现[5] 这篇文章中的一段伪代码: const channel = new MessageChannel(); const...参考我的这篇对 EventLoop 规范的解读 深入解析 EventLoop 和浏览器渲染、帧动画、空闲回调的关系,关键的原因在于微任务会在渲染之前执行,这样就算浏览器有紧急的渲染任务,也得等微任务执行完才能渲染...postMessage 定时器在 React 时间切片中的运用。 为什么时间切片需要用宏任务,而不是微任务。

    1.3K30

    JavaScript 测试系列实战(二):深层渲染和快照测试

    今天,我们将更深入地挖掘并学习如何测试组件的 Props,如何(以及为什么)使用 mount 函数,以及什么是 Jest 快照测试。...在测试与 DOM 的交互或者在处理高阶组件时,mount 函数也可以派上用场。_Mount 使用 DOM 实现的模拟,Jest 默认使用的是 jsdom。...当我们再次运行快照测试时,Jest 会将新的快照与旧的快照进行比较,如果两者不一致,测试就会失败,从而帮助我们确保用户界面不会发生意外改变。...在 TodoList 的测试代码中添加快照测试: // src/TodoList.test.js import React from 'react'; import { shallow } from '...除此之外,我们还介绍了 Jest 快照测试,这是一个非常强大的工具,可以追踪组件渲染方式的变化。在接下来的文章中,我们还将介绍测试中常见的 Mock 技巧——与组件的模拟交互,不见不散!

    2.7K20

    前端模块化开发--React框架(一): 入门和面向组件编程

    ('names')); 三、模块化 1.模块 1)理解: 向外提供特定功能的js程序, 一般就是一个js文件 2)为什么: js代码更多更复杂 3)作用: 复用js, 简化js的编写..., 提高js运行效率2.组件 1)理解: 用来实现特定(局部)功能效果的代码集合(html/css/js) 2)为什么: 一个界面的功能更复杂 3)作用: 复用编码, 简化项目编码, 提高运行效率3.模块化...'你喜欢我' : '我喜欢你'}; } } //2、渲染组件标签 ReactDOM.render(, document.getElementById... this.msgInput = input}/> b.回调函数在组件初始化渲染完或卸载时自动调用 2)在组件中可以通过this.msgInput...中去 ReactDOM.render(, document.getElementById('sample')) 4、收集表单数据 1)问题: 在react应用中

    3.1K20

    聊聊React类组件中的setState()的同步异步(附面试题)

    接收的state和props被保证为最新的 setState(stateChange, [callback]) stateChange为对象, callback是可选的回调函数, 在状态更新且界面更新后才执行...'test3 setState callback()', this.state.count) }) 中有一个回调函数,在我们一般情况下是用其简写形式(对象形式),只有在需要setState()后获取最新的状态数据时才会用到函数形式的...在react控制的回调函数中: 生命周期勾子 / react事件监听回调 非react控制的异步回调函数中: 定时器回调 / 原生事件监听回调 / promise回调 /… 异步 OR 同步?...('example')) // 渲染组件标签, 内部会调用组件标签对象的render()虚拟DOM 结论我已经放在开头了,但是在更新...在setState()的callback回调函数中 四.面试题 注释里箭头 左侧为次序,右侧为打印出的值 <!

    2.2K10

    关于如何在 Mobx 中组织 Stores

    Store 的主要职责是将逻辑和状态从组件中移至一个独立的,可测试的单元,这个单元在 JavaScript 前端和后端中都可以使用。..., document.getElementById('root') ); 页面引入 import React, { Component } from 'react';...RootStore 在进入页面,会对 Store 初始化 缺点: 组件侵入性,需要改变 React 组件原本的结构,例如所有需要响应数据变动的组件都需要使用 observer 装饰,组件本地状态也需要...A,B 两个页面,都要修改 C 页面,那么,我在 A 和 B 页面修改 C 的 Store,很方便,但是,如果不制定一套规范,如果数据改变,要追踪来源,很困难,而且很容易产生意想不到的情况。...通过configure({ enforceActions: 'always' });杜绝在 Action 以外对 Store 的修改 博客 欢迎关注我的博客

    1.2K00

    📝  《React性能优化完全手册:从useMemo到并发模式》

    —— 从原理到实践,拒绝无效优化 开篇:为什么React应用会变慢?...';createRoot(document.getElementById('root')).render(); 实战技巧一:useTransition 处理过渡更新适用场景:表单提交、筛选器切换等需要延迟渲染的操作参数..."resource-summary:script:size": ["error", {"maxNumericValue": 500000}] } } }} 灰度环境下的性能回归测试...}} 异常熔断机制设计分级降级策略:graph LR A[接口超时] -->|3次失败| B[切换备用API] B -->|继续失败| C[展示本地缓存] C -->|无缓存| D[降级UI骨架屏...行动号召:立即用npx lighthouse 的URL>生成首份性能报告在团队README中添加性能Checklist评论区留言#React优化实践 分享你的实战案例▌▍▎▏ 你的每个互动都在为技术社区蓄能

    1.1K20

    react生态下jest单元测试

    –coverage 图片 会在html-report目录下生成report.html文件 图片 2.SnapShot Testing(快照测试): 快照测试第一次运行的时候会将被测试ui组件在不同情况下的渲染结果保存一份快照文件...后面每次再运行快照测试时,都会和第一次的比较,若组件代码有所改变,则快照测试会失败,如果组件代码是最新的,优化过得代码,则需要更新快照,免得每次执行报错。...如果尝试对这些对象进行快照,它们将强制快照在每次运行时失败. //2.Jest允许为任何属性提供非对称匹配器。...在写入或测试快照之前,将检查这些匹配器,然后将其保存到快照文件而不是接收到的值 it('will check the matchers and pass', () => { const user...在写入或测试快照之前,将检查这些匹配器,然后将其保存到快照文件而不是接收到的值 it('will check the matchers and pass', () => { const user =

    3K20

    学习 React Native for Android:React 基础

    Shaw 的 《Learn Code the Hard Way》 系列的案例驱动的形式,从例子开始着手。我相信,掌握一门新技术最好的方法就是自己动手。...因此,我并不打算面面俱到的列举所有关于 React 的内容,而更倾向于担任一个引路人的角色:把读者们带到 React 花园的门前,然后让读者们在 React 花园里来一场自助游。...本系列也将一直使用它学习 React / React Native。熟悉下 Atom 的使用,并选择安装我在上篇博文中推荐的一些插件。...这样,多次的节点定位和修改就合并成了一次组件的整体刷新。这就是为什么虚拟 DOM 的速度要比 DOM 快的重要原因。 由上也可看出,虚拟 DOM 技术依赖于 DOM diff 算法的效率和准确性。...而这个算法依赖于以下两个假设: 组件的 DOM 是相对稳定的。虚拟 DOM 在任何一个时刻的快照,和短时间内另一时刻的快照并不会有太大的变化,这样就很容易通过比较找出发生改动的部分。

    10.2K20

    【React】学习笔记(二)——组件的生命周期、React脚手架使用

    React 组件中包含一系列钩子函数(生命周期回调函数),会在特定的时刻调用。我们在定义函数时,会在特定的生命周期回调函数中,做特定的工作。...因为React正在设计一个异步渲染功能,他们总结之前的经验,过时的生命周期往往会带来不安全的编码实践,React官方觉得,这三个钩子在之后的版本潜在的误用问题可能更大 即将废弃三个钩子 ● componentWillMount...时,甚至是更新时也取决于props时使用 派生状态会使代码冗余,并使组件难以维护,所以知道即可 1.3.2、getSnapshotBeforeUpdata 简译:在更新之前获取快照 什么是快照值呢?...返回的快照值 class NewList extends React.Component{ render(){ state={newArr:[]} componentDidMount...--- 页面性能分析文件(需要web-vitals库的支持) setupTests.js ---- 组件单元测试的文件(需要jest-dom库的支持) 文件引入简化 可以将各个组件的名称改为index.jsx

    2.9K30

    React系列-自定义Hooks很简单

    React系列-Mixin、HOC、Render Props(上) React系列-轻松学会Hooks(中) React系列-自定义Hooks很简单(下) 我们在第二篇文章中介绍了一些常用的hooks,...不明白Redux工作流的同学可以看看这篇Redux系列之分析中间件原理(附经验分享) 为什么使用 官方说法: 在某些场景下,useReducer 会比 useState 更适用,例如 state 逻辑较复杂且包含多个子值...为什么使用 如果你在接触 Hook 前已经对 context API 比较熟悉,那应该可以理解,useContext(MyContext) 相当于 class 组件中的 static contextType...如果想得到某个时点的数据,就要对 Store 生成快照。这种时点的数据集合,就叫做 State。...区别就是:useEffect是异步的,useLayoutEffect是同步的 为什么使用 解决一些闪烁场景 如何使用 useLayoutEffect(fn, []) // 接收两个参数 一个是回调函数

    2.5K20
    领券