使用 Jest 测试通用函数

面试官:小伙子,你的数组去重方式惊艳到我了

前端开发中,编写可重用的通用函数是一个常见的任务。这些功能通常运行在不同的应用程序或模块中,并用于执行诸如验证、处理和格式化等任务。

但是,在编写这些通用函数时,保证它们的正确性并不容易。一个小错误可能会导致整个应用程序崩溃,而且找到这个错误也非常困难。因此,在编写通用函数时使用测试驱动开发(Test Driven Development TDD)方法是一个很好的选择。

在本文中,我们将使用 Jest 框架测试通用函数并深入了解使用 Jest 的一些最佳实践。

什么是 Jest?

Jest 是一个开源的 JavaScript 测试框架,由 Facebook 推出。它为测试提供了一系列开箱即用的功能,如断言(assertions)、模拟(mocking)和测试报告等。它非常容易配置,并且适用于测试任何 JavaScript 代码,包括 React 组件、Node.js 服务器和通用函数等。

在接下来的部分中,我们将演示如何使用 Jest 测试通用函数,并介绍 Jest 提供的基本功能。

编写测试用例

在开始编写测试用例之前,让我们先来看一个示例通用函数:

-------- ------ -- -
  ------ - - --
-

这是一个非常简单的通用函数,它接受两个数字 a 和 b 作为参数并返回它们的和。我们将使用 Jest 编写测试用例来检查该函数是否按预期工作。

首先,我们需要安装 Jest。可以使用 npm 安装:

--- ------- ---------- ----

一旦安装成功,我们可以创建一个名为 sum.test.js 的新文件,以编写测试用例。在该文件中,我们将包含一个或多个测试套件(test suite),每个测试套件将测试单个功能或多个相关功能。

------------- ---------- -- -- -
  ---------- - - - -- ----- --- -- -- -
    ------------- ------------
  ---
---

首先,我们使用 describe 函数创建一个测试套件,并将其命名为 sum function。接下来,我们使用 test 函数创建一个测试用例,并将其命名为 adds 1 + 2 to equal 3。该测试用例使用 expect 函数来断言 sum(1, 2) 的值应该等于 3。

注意,我们在此处使用的是 toBe 断言,它检查值的类型和值是否相等。Jest 还提供了其他许多断言,例如 toEqual、toBeNull、toBeTruthy 等等。

运行测试

要运行测试用例,只需在命令行中运行 Jest:

--- ----

这将自动运行所有测试套件(所有以 .test.js 结尾的文件),并显示测试运行结果。

 ----  ---------------
  --- --------
    - ---- - - - -- ----- - -- ---

---- ------- - ------- - -----
------       - ------- - -----
----------   - -----
-----        ----- -
--- --- ---- ------ -------- ---------------------

注意,我们的测试用例通过了,所有测试均已通过(1 passed)。如果有错误或失败的测试用例,Jest 将向我们报告哪些测试失败并提供了有关错误的详细信息。

测试多个输入和输出

上面提到的示例通用函数非常简单,只接受两个数字作为参数并返回它们的和。但是,在实际应用程序中,常常需要编写更复杂的通用函数,可能需要处理多个不同类型的输入和产生不同类型的输出。

在这种情况下,我们需要测试多个输入和输出,以确保函数能够正确地处理所有情况。为此,我们可以创建多个测试用例,每个测试用例都使用不同的输入,以检查函数的输出是否正确。

例如,假设我们有一个名为 capitalize 的通用函数,它接受一个字符串作为参数并返回一个首字母大写的字符串。我们可以编写以下测试用例,来测试 capitalize 函数在不同情况下的输出是否正确:

-------------------- ---------- -- -- -
  ----------------- ------ ------ -- -- -
    ------------------------------------------
  ---

  ----------------- -------- ------- -- -- -
    ------------------------ -------------------- --------
  ---

  ----------------- ----- -------- -- -- -
    --------------------------------
  ---
---

注意,这里我们编写了三个测试用例,每个测试用例都使用不同的输入测试 capitalize 函数的输出。第一个测试用例测试 capitalize 函数是否可以正确地将单个单词的首字母大写。第二个测试用例测试 capitalize 函数是否可以正确地将多个单词的首字母大写。第三个测试用例测试 capitalize 函数是否可以正确地处理空字符串。

监视文件变化

在开发过程中,我们需要经常运行测试来检查代码的正确性。为了简化这个过程,Jest 提供了一些工具,可以在文件发生更改时自动重新运行测试。

要启用监视模式(watch mode),只需在命令行中运行 Jest,并使用 --watchAll 或 -w 参数:

--- ---- ----------

现在,Jest 将自动运行所有测试套件,并在文件更改时重新运行测试。此外,每次运行测试时,Jest 还将仅运行发生更改的测试套件。

模拟函数

在编写通用函数时,常常需要模拟其他函数或模块。这些模块可能会涉及网络请求、数据库访问或事件监听等任务,而在运行测试时,我们往往不想执行这些任务。

为了避免这种情况,我们可以使用 Jest 提供的模拟函数(mock),以模拟其他函数的行为。模拟函数可以将函数替换为一个简单的实现,以在运行测试时避免执行其他函数或模块。

例如,假设我们有一个名为 fetchData 的函数,它使用 axios 库从远程服务器获取数据。我们可以使用 Jest 提供的 jest.fn() 函数创建一个模拟函数,并将其替换为 fetchData 函数的实现。在此之后,每当我们调用 fetchData 函数时,它将调用模拟函数而不是 axios 库:

------ ----- ---- --------

-------- ----------- -
  ------ ------------------------------------ -- ---------------
-

------------------- ---------- -- -- -
  ------------- ---- ---- -------- -- -- -
    ----- --------- - ---------- -- ----------------- ----- - ---- ----- - ----
    --------- - ----------

    ------ --------------------- -- -
      -------------------------------------
      ---------------------- ---- ----- ---
    ---
  ---
---

注意,我们在此处使用了 Promise.resolve() 函数,以创建一个返回 { data: { foo: 'bar' } } 的模拟响应。该模拟响应作为模拟函数的返回值,以模拟返回自服务器的数据。

结论

在本文中,我们已经学习了如何使用 Jest 测试通用函数,并了解了一些最佳实践和使用 Jest 所提供的一些示例代码。使用测试驱动开发的方法,可以帮助我们编写更可靠和高质量的代码,并减少错误和缺陷。

如果您还没有尝试过 Jest,请花些时间学习它,并在下一次编写通用函数时使用它。我相信您会发现 Jest 是一个强大的工具,它可以帮助您写出更好的代码!

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/66fd3c9544713626017b2859


猜你喜欢

  • 使用 Babel & Webpack 过渡到 TypeScript

    在前端开发过程中,JavaScript 的弱类型和运行时检查特性可能会导致一些难以排查的问题。为了避免这些问题,越来越多的团队开始使用 TypeScript,这是一种带有静态类型检查的 JavaScr...

    15 天前
  • CSS Flexbox 实现具有间隔的等分布局

    CSS Flexbox 是一种强大、灵活的布局模式,可以实现具有间隔的等分布局。本文将介绍如何使用 CSS Flexbox 实现这种布局,并提供代码示例和实用技巧。

    15 天前
  • 利用 Mocha 的 Test.done() 函数控制异步测试

    Mocha 是一个流行的 JavaScript 测试框架,它可以用于测试前端和后端 JavaScript 应用。在测试过程中,我们有时需要测试异步代码,如网络请求、回调函数、计时器等。

    15 天前
  • 优秀的 CSS Reset 扩展与使用

    优秀的 CSS Reset 扩展与使用 CSS Reset 是前端开发过程中非常重要的一个概念。它可以让页面在不同的浏览器中表现一致,最终达到跨浏览器兼容的目的。然而,CSS Reset 模板通常只包...

    15 天前
  • Next.js 中如何使用 Material-UI 组件库

    随着前端技术的不断发展,越来越多的开发者使用组件库来提高开发效率和代码复用性。而 Material-UI 组件库作为一个优秀的 React 组件库,拥有丰富的组件和灵活的自定义能力,受到了广泛的使用。

    15 天前
  • ECMA2019 的标志性变化:Array.flatMap

    ECMA2019 的标志性变化:Array.flatMap ECMAScript 2019,也称 ES2019,已经于 2019 年6月被正式发布。除去许多语言功能上的改进外,这个版本中引入了一个非常...

    15 天前
  • ES6 不常见之处的语言特性实现任务队列

    前言 ES6 可以说是前端开发中的一个重大技术进步,不仅引入了更好的语法特性,而且带来了许多不同与以往的编程新概念。 在这篇文章中,我们将会探讨如何利用 ES6 中的一些不常见之处的语言特性实现任务队...

    15 天前
  • 在 Angular 项目中使用 RxJS 库的常见问题及解决方式

    RxJS 是一款流行的 JavaScript 库,它提供了一种用于处理异步事件的函数式编程方法。它与 Angular 框架紧密结合,可以大大简化 Angular 应用程序的开发和维护,但在使用过程中也...

    15 天前
  • MongoDB 如何进行数据备份?

    简介 MongoDB 是一个非关系型数据库,用 JavaScript 的对象表示数据,可以使用 JSON 格式存储数据。由于其高性能、高可扩展性和易于管理的特点,成为了越来越多 Web 应用开发者和企...

    15 天前
  • 在 SASS 中使用 Chrome 浏览器渲染引擎设计样式

    介绍 在前端开发中,我们经常需要设计和开发样式。而 SASS 是一种 CSS 预处理器,它可以帮助我们更加有效地编写样式。同时,Chrome 浏览器也是一个广泛使用的浏览器,并且其渲染引擎非常出色。

    15 天前
  • Kubernetes 中的控制器详解

    Kubernetes 是一个广泛使用的容器编排平台,可帮助开发人员管理和管理容器化应用程序。在 Kubernetes 中,控制器是一种强大的机制,用于管理一组相关的容器化应用程序。

    15 天前
  • JavaScript 中 ES7(ECMAScript 2016)的新功能列表

    ES7,也被称为 ECMAScript 2016,是 JavaScript 语言的一个更新版本,它引入了一些新的功能和语法糖。这些改进可以让开发人员更加高效地编写代码,使其更简洁易用,并提高代码性能和...

    15 天前
  • CSS Flexbox实现等高容器内,子元素高度不定的方案

    在网页开发中,我们通常需要构建等高容器,以便让子元素在高度上均衡分配。但是,当子元素的高度不确定且不同步时,这种布局变得有挑战性。为了解决这个问题,我们可以使用CSS Flexbox,它可以轻松地处理...

    15 天前
  • ECMAScript 2019:使用 GraphQL 构建 Scalable API

    GraphQL 是一个用于 API 建模的数据查询语言,旨在尽可能地提高查询效率和灵活性。它使得客户端可以请求需要的数据,而不必依赖服务器。这样可以减少网络通信并且允许客户端自由地组成和调整数据的结构...

    15 天前
  • 超实用的 vue 裁剪组件 vue-cropper

    在前端开发过程中,裁剪图片是一项常用的功能需求。如何在图片上传之后方便、快速地对图片进行裁剪呢?这时候需要使用一款实用的裁剪组件,vue-cropper 就是一个值得推荐的组件。

    15 天前
  • Sequelize 虚拟主键与 id 主键

    在 Sequelize 中,每个模型都应该有一个主键来标识一条数据。Sequelize 默认使用 id 字段作为主键,但是也可以使用自己的主键。除了自己设定主键之外,在 Sequelize 中还有一种...

    15 天前
  • 用 ES8 的 async/await 构建一站式 RESTful API

    用 ES8 的 async/await 构建一站式 RESTful API 随着现代 Web 应用程序的不断发展,RESTful API 已经成为了许多新项目的首选。

    15 天前
  • 如何使用 Express.js 和 SendGrid 实现邮件发送功能

    在现代的 Web 开发中,邮件发送是一项不可或缺的功能。不管是用户注册、密码重置,还是发送各种邮件通知,很多应用都需要用到邮件发送功能。而通过使用 Express.js 和 SendGrid,实现邮件...

    15 天前
  • 在 Jest 中实现常量变量的 mock

    在 Jest 中实现常量变量的 mock 随着前端应用的复杂性不断提高,测试变得越来越重要。Jest 是一个出色的 JavaScript 测试框架。它能够使你轻松地对你的框架进行测试。

    15 天前
  • 在 Deno 中使用 Express.js:详细教程和示例代码

    Deno 是一个现代化的 JavaScript 和 TypeScript 运行时,在近几年越来越受到前端社区的欢迎。它提供了许多 Node.js 无法提供的优点,例如安全性、稳定性和开箱即用的 Typ...

    15 天前

相关推荐

    暂无文章