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

Jest与React Testing Library:前端测试的最佳实践

Jest 是一个功能丰富的JavaScript测试框架,而React Testing Library 是一种提倡以用户角度编写测试的库,它鼓励测试组件的行为而不是内部实现细节。...const button = screen.getByRole('button');fireEvent.click(button);清理和解构每个测试之后,确保清理掉任何副作用,如添加到DOM中的元素...(screen.getByText('Loading...')).toBeInTheDocument();});组件库的测试对于复杂的组件库,可以创建一个setupTests.js文件来设置全局的模拟和配置...(screen.getByTestId('visible-element')).toBeInTheDocument();验证数据渲染测试组件是否正确呈现从API获取的数据:const data = {.../myFunction';jest.spyOn(myModule, 'myFunction');// 测试中调用函数myFunction();// 检查函数是否被调用expect(myFunction

7500

如何测试 React 异步组件?

异步组件的测试内容 我们知道异步请求主要用于从服务器上获取数据,这个异步请求可能是主动触发的,可能是(鼠标)事件响应,本文主要包含 2 方面内容: 如何测试 componentDidMount 生命周期中发出的异步请求...---- 对于异步组件,有两件步骤需要进行测试: 第一:测试异步方法本身有没有被调用,并且传了正确的参数。 第二:调用之后,应用程序应该做出响应。 一起来看看代码中该如何实现?...为此,我们使用 waitFor 方法,同时检查标题是否呈现,之后遍历检查,确保每一个标题在页面上。...mock 使组件可以获取静态假数据; 测试加载状态; 测试异步方法是否被正确调用,并且带上了正确的参数; 测试组件是否正确地渲染了数据 测试异步方法错误时,组件是是否渲染了正确的状态 文中关于登录成功后页面跳转并未测试...希望这篇文章对大家有所帮助,可以参考我往期的文章或者评论区交流你的想法和心得,欢迎一起探索前端。

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

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

以前的我(Kent)并不是很喜欢那个时候的测试环境,为此写了一个 React Testing Library。...你可以直接调 screen.debug 而不是 debug。...('alert')).toBeInTheDocument() // ✅ expect(screen.getByRole('alert')).toBeInTheDocument() expect(screen.queryByRole...而如果 waitFor 里只有一个断言,我们则可以等待 UI 渲染到断言的同时,可以在其中一个断言失败时更快地获得报错信息。...建议:如果你想断言某个东西是否存在,那么就做显式的断言操作 总结 作为测试库工具系列的维护者,我们尽最大努力使 API 能够引导人们尽可能有效地使用,一些不足之处,我们会尝试正确地记录下来,即使这会非常地困难

1.2K20

React 应用架构实战 0x7:测试

目前,除了 React Testing Library 提供的所有函数之外,我们还导出了以下实用工具: appRender 是一个函数,它调用 React Testing Library 中的 render...函数并将 AppProvider 添加为 wrapper 需要这个函数是因为我们的集成测试中,我们的组件依赖于 AppProvider 中定义的多个依赖项,如 React Query 上下文、通知...等等 提供 AppProvider 作为 wrapper 将在我们进行测试时用于渲染组件 checkTableValues 是一个函数,它遍历表格中的所有单元格,并将每个值与提供的数据中的相应值进行比较...,以确保所有信息都在表格中显示 waitForLoadingToFinish 是一个函数我们进行测试之前,它会等待所有加载提示消失 可应用于当我们必须等待某些数据被获取后才能断言值时 // src...为了对我们的应用程序进行端到端测试,我们可以使用 Cypress,这是一个非常流行的测试框架,它通过无头浏览器中执行测试来工作。这意味着测试将在真实的浏览器环境中运行。

1.6K80

前端单测,为什么不要测 “实现细节”?

相信不少同学写单测的时候,最大的困扰不是如何写测试代码,而是:“应该测什么?”,“要测多深入”,“哪些不该测”。...算了,给这些 “假正确” 和 “假错误” 打补丁,还不如不写测试,把这些测试都干了得了。如果有一个工具可以解决这个问题不是更好吗?是的,有的!...如果没有正确绑定 onClick 点击事件,会报错。这样可以解决 “假正确” 的问题。...请求执行,并获取成功的响应,确保可以展示成功消息) 将这份手动操作清单转化成自动化测试 好了,这篇外文就给大家带到这里了,希望对大家单测中有所帮助。...测试 “实现细节” 有点像我们撒谎,一次撒谎就要撒更多的谎来圆第一个谎,当我们测试一个细节的时候,我们只能管中窥豹,这无形中会产生一个不存在的用户:Test,这也是为什么很多人觉得代码一改,测试得改的原因

92850

如何测试驱动开发 React 组件?

而且 TDD 更多地需要编写独立的测试用例,比如只测试一个组件的某个功能点,某个工具函数等。...Confirmation 组件的特点: Confirmation 标题 确认描述 —— 接收外部程序想要确认的问题 一个确认的按钮,支持外部回调函数 一个取消的按钮,支持外部回调函数 这两个按钮都不知道点击时接下来要做什么事...现在我们得到了我们想要的组件渲染的 HTML ,现在我想要确保我可以从外部传递这个组件的按钮的回调函数,并确保它们单击按钮时被调用。...(onOk).toHaveBeenCalled(); }); 先用 jest.fn 创建一个模拟函数,将其作为“onOk”处理函数传递给组件,模拟单击“确认”按钮,并断言函数已被调用。...希望这篇文章对大家有所帮助,可以参考我往期的文章或者评论区交流你的想法和心得,欢迎一起探索前端。

2.1K10

如何测试驱动开发 React 组件?

而且 TDD 更多地需要编写独立的测试用例,比如只测试一个组件的某个功能点,某个工具函数等。...Confirmation 组件的特点: Confirmation 标题 确认描述 —— 接收外部程序想要确认的问题 一个确认的按钮,支持外部回调函数 一个取消的按钮,支持外部回调函数 这两个按钮都不知道点击时接下来要做什么事...现在我们得到了我们想要的组件渲染的 HTML ,现在我想要确保我可以从外部传递这个组件的按钮的回调函数,并确保它们单击按钮时被调用。...(onOk).toHaveBeenCalled() }) 先用 jest.fn 创建一个模拟函数,将其作为“onOk”处理函数传递给组件,模拟单击“确认”按钮,并断言函数已被调用。...希望这篇文章对大家有所帮助,可以参考我往期的文章或者评论区交流你的想法和心得,欢迎一起探索前端。

2.2K10

前端测试一共有哪几种?

我喜欢用它来类比测试,因为做测试就跟刷墙一样,开始之前要选择正确的策略。你会用小刷头来刷墙么?当然不会。那会花很长时间,而且效果不均匀。那你会用滚筒来刷所有东西么?...你可以 React Testing Library setup docs 里了解更多关于上面的测试工具函数。.../i)).toBeInTheDocument() expect(screen.getByText(/orange/i)).toBeInTheDocument() expect(screen.getByText...(/pear/i)).toBeInTheDocument() expect(screen.queryByText(/no items/i)).not.toBeInTheDocument() })...UI 集成测试则是无法确保你是否正确把参数传给后端,以及是否正确处理返回错误。E2E 确实很好,但一般来说你只会把它们放在测试环境下跑(类生产环境,但是不是真生产环境)来获取相对较高的代码信心。

53720

单元测试

,但是当运行一组测试用例时,会出现报错 这种情况通常是由于一组测试用例中,前一个测试用例没有正确地清理或重置测试环境,导致后续的测试无法找到期望的元素或状态。...为了解决这个问题,可以尝试从以下几点入手: 使用 beforeEach 函数或 beforeAll 函数每个测试用例开始之前进行初始化设置。...每个测试用例之后使用 afterEach 函数或 afterAll 函数来清理测试环境。这样可以确保每个测试用例完成后,不会留下任何对后续测试用例有影响的状态。...如果测试用例依赖于某些外部资源(例如网络请求),请确保测试之前和之后进行适当的管理和清理,以确保资源的正确使用和释放。...React 组件的异步更新和副作用的工具函数,它的主要作用是确保测试中正确地触发和等待组件更新。

17810

测试中如何处理 Http 请求?

不过,我们肯定不是想真的调用 fetch 函数,所以我们会选择把 window.fetch 给 Mock 了: // __tests__/checkout.js import * as React from...没有这一步,我们不能确定服务器是否真的能处理发出去的请求。还有一个问题,你怎么能确定用户鉴权的信息是不是真的被带上呢?...特别是一些测试中,我们要假定后端要返回的内容的时候,就不得不在所有地方都要 Mock 一次。在这种情况下,就会给你和要做测试的东西设置了很多障碍。...很长一段时间里我的解决方法是:声明一个假的 fetch 函数,把后端要 Mock 的内容都放里面。我 Paypal 的时候就试过,发现还挺好用的。...msw 不仅可以测试中拦截请求,实现集成、E2E 测试,还可以在前端开发时来 Mock 数据,确实是一个有趣的实践。 最近给我们项目写不少单测,其实单测和集成测试还是有很多互补的地方的。

1.2K10

Jest + React Testing Library 单测总结

整个流程和写法不是特别难,所以就理所当然地觉得,写测试不是特别难。 加上之前实际的工作中,也没有太多的写测试的经历,所以当自己需要对组件库补充单元测试的时候,发现并不能照葫芦画瓢来写单测。...组件单测中,有的时候我们可能只关注一个函数是否被正确地调用了,或者只想要某个函数的返回值来支持该组件渲染逻辑是否正确,而并不关心这个函数本身的逻辑。...: const returnsTrue = jest.fn(() =>true); // 定义了函数体 console.log(returnsTrue()); // true // 可以给mock的函数设置返回值...();        // await 一个新的元素被找到,并且最终确实被找到当 promise resolves 并且组件重新渲染之后。    ...但是实际的工作中,产品的迭代、需求的变更以及各种不确定的因素,我们经常会陷入“bug的轮回” —— 关上一个bug,点亮另一个bug。 随着业务复杂度的提升,测试的人力成本会越来越高。

4.5K20

如何测试 React 路由 ?

(screen.getByText(/这是主页/i)).toBeInTheDocument() userEvent.click(screen.getByText(/关于/i)) expect(...screen.getByText(/这是关于页/i)).toBeInTheDocument() }) MemoryRouter 有 2 个参数 第一个参数 initialEntries={["/users...(screen.getByText(/Not Found/i)).toBeInTheDocument() }) 通用测试 当页面有多个的时候,我们可以添加一个通用组件来确保每个页面都没有错误 import...来测试; 通过 userEvent.click 点击确保页面可以正确渲染; 提供一个公共包裹组件,通过遍历来测试每个页面,确保渲染 以上就是本文的全部内容,那么如何测试 react hooks ?...希望这篇文章对大家有所帮助,可以参考我往期的文章或者评论区交流你的想法和心得,欢迎一起探索前端。

2.1K20

如何测试 React 路由 ?

(screen.getByText(/这是主页/i)).toBeInTheDocument(); userEvent.click(screen.getByText(/关于/i)); expect...(screen.getByText(/这是关于页/i)).toBeInTheDocument(); }); MemoryRouter 有2个参数 第一个参数 initialEntries={["/users...(screen.getByText(/Not Found/i)).toBeInTheDocument() }) 通用测试 当页面有多个的时候,我们可以添加一个通用组件来确保每个页面都没有错误 import...MemoryRouter 来测试; 通过 userEvent.click 点击确保页面可以正确渲染; 提供一个公共包裹组件,通过遍历来测试每个页面,确保渲染 以上就是本文的全部内容,那么如何测试 react...希望这篇文章对大家有所帮助,可以参考我往期的文章或者评论区交流你的想法和心得,欢迎一起探索前端。

2.1K20

React 现代化测试

测试的动机 测试用例的书写是一个风险驱动的行为, 每当收到 Bug 报告时, 先写一个单元测试来暴露这个 Bug, 日后的代码提交中, 若该测试用例是通过的, 开发者就能更为自信地确保程序不会再次出现此...(代表库: jest、mocha) 集成测试: 模拟用户的行为进行测试, 对网络请求、获取数据库的数据等依赖第三方环境的行为进行 mock。...(代表库: jest、react-testing-library) e2e 测试: 模拟用户真实环境上操作行为(包括网络请求、获取数据库数据等)的测试。...(getByText(/当前位于第一页/)).toBeInTheDocument() fireEvent.click(getByText(/下一页/)) expect(getByText...(/当前位于第一页/)).not.toBeInTheDocument() expect(getByText(/当前位于第二页/)).toBeInTheDocument() }) })

92230

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

比如一个函数一个类、一个组件,它们都是模块。 使用单元测试的优点: 更好地交付高质量代码。代码不可能没有 bug,测试能帮你找出来; 更容易重构。...Jest 基本使用 我们先写一个简单的函数,作为被测试的模块。...我们通常使用 expect 来测试一个模块的逻辑是否符合预期。expect 会将模块返回的结果封装成一个对象,然后提供非常丰富的方法做测试。...更多 API 可以看文档: https://jestjs.io/docs/expect 你可以用 describe 方法将多个相关的 test 组合起来,这样能让你的测试用例更好地被组织,测试报告输出更有条理...支持回调函数风格的测试,你需要调用函数传入的 done 函数来表明测试完成: test('异步测试', done => { setTimeout(() => { expect('前端西瓜哥

2.8K20

3w字长文带你【从0开发一个自己的前端组件库】 | 技术创作特训营第五期

/packages" 5.安装eslint pretter两个vscode插件 6.vscode settings中设置format:pretter和 on save 检查commit 1.安装husky...create-react-app不支持scss,需要安装node-sass解决 pnpm install node-sass --save 因为我们做的是组件库,比如像antd design组件库是蓝色样式,所以我们做的组件库需要设置色彩系统的样式...比如上面代码中的@include button-size 函数,这个是scss的一个特性,可以从官网上看下介绍。...将element传入expect,调用toBeInTheDocument表示按钮插入到了页面中 expect(element).toBeInTheDocument() // 获取按钮的...(element).toBeInTheDocument() expect(element.tagName).toEqual('A') expect(element).toHaveClass

54551

Jest 单元测试快速上手指南

开头的表示忽略与其匹配的文件 忽略单个文件 该文件顶部添加 /* istanbul ignore file */ 忽略一个函数, 一块分支逻辑或者一行代码 函数, 分支逻辑或者代码行的上一行添加...($title).toBeInTheDocument(); }); }); 执行 yarn jest test/Title.spec.ts 查看结果 处理静态资源引用 react 组件有时引用一些静态资源..., 譬如图片或者 css 样式表, webpack 会正确的处理这些资源, 但是对 Jest 来讲, 这些资源是无法识别的 创建 Title.less 样式表 h1 { color: red;...linaria 是通过 babel 插件将其预编译为 class 名的, 这里可以 mock 一下 css 函数, 返回一个随机值作为 class 名 根目录创建 jest.setup.js jest.mock.../docs/en/mock-functions#mocking-modules mock 环境变量和命令行参数 有的模块会从环境变量和命令行参数取值, 并且可能是模块初始化时获取的 // process.ts

3.3K30

带你入门前端工程(四):测试

什么是测试 维基百科的定义: 规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 可以这样理解:测试的作用是为了提高代码质量和可维护性。...从前端角度来看,单元测试就是对一个函数一个组件、一个类做的测试,它针对的粒度比较小。 单元测试应该怎么写呢? 根据正确性写测试,即正确的输入应该有正常的结果。...对一个函数做测试 例如一个取绝对值的函数 abs(),输入 1,2,结果应该与输入相同;输入 -1,-2,结果应该与输入相反。如果输入非数字,例如 "abc",应该抛出一个类型错误。...(abs(-1)).toBe(1) expect(() => abs('abc')).toThrow(TypeError) // 类型错误 }) 现在我们需要测试一下 abs() 函数 src...Funcs:函数覆盖率,是否执行了每个函数。 Lines:行覆盖率,是否执行了每一行代码。 可能有人会有疑问,1 和 4 不是一样吗?其实不一样,因为一行代码可以包含好几个语句。

1.6K10
领券