Chai 的 matchers 使用指南

Chai 的 matchers 使用指南

原文链接:https://www.jianshu.com/p/a9f3616cb8ca

Chai 是一个非常流行的断言库,它可以结合 Mocha 或其他测试框架使用。Chai 的 matchers 可以帮助我们用更简洁明了的方式编写断言,本文将从入门到进阶为大家介绍 Chai 的 matchers。

  1. 安装和使用

在使用 Chai 之前,我们需要先通过 npm 安装 Chai:

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

然后在测试文件中引入 Chai:

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

在使用 Chai 时,我们通常会使用其中的 expect 函数,它可以接受一个参数,并返回一个 Expect 实例,然后我们就可以在这个实例上调用各种 matchers 来编写断言了。

下面是一个简单的例子:

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

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

在上面的例子中,我们使用 expect 函数返回一个 Expect 实例,然后调用它的 to.be.true 方法来断言 true 是否为真。

  1. 基本 matchers

除了 to.be.true,Chai 的 matchers 还有很多其他方法。下面我们将为大家介绍一些基本的 matchers:

  • to.be.ok:判断一个值是否“真值”,也就是不是 null、undefined、false、0、NaN 等假值(以下简称“falsy”)的值。
  • to.equal:判断两个值是否相等,它使用的是 JavaScript 的全等运算符(===)。
  • to.have.lengthOf:判断一个对象的长度是否与指定长度相等,支持字符串、数组和类似于数组的对象(比如 arguments)。
  • to.include:判断一个数组或字符串是否包含指定的元素或子串。
  • to.be.a、to.be.an:判断一个值是否为指定的类型;to.be.a 等同于 to.be.an。

下面是这些方法的用法示例:

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

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

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

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

  ---------- ---- -- ----- -- -- --------- ------ -- -- -
    ------------- --------------------------
  ---
---
  1. 比较 matchers

除了基本的 matchers,Chai 还提供了一些用于比较值的 matchers,它们包括:to.be.above、to.be.below、to.be.at.least、to.be.at.most、to.be.within 和 to.be.closeTo。

这些 matchers 用于比较数字和日期类型的值,下面是用法示例:

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

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

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

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

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

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

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

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

上面的代码中,我们使用了 to.be.above、to.be.below、to.be.at.least、to.be.at.most 和 to.be.within 来比较数字类型的值,使用 to.be.closeTo 来比较日期类型的值。to.be.closeTo 计算的是两个日期之间的毫秒差,如果差值小于指定的 tolerance,则断言通过。

  1. 集合型 matchers

除了比较 matchers,Chai 还提供了很多用于集合型数据类型(比如数组和对象)的 matchers,它们非常实用。下面是其中的一些:

  • to.include:判断一个数组或对象是否包含指定的元素或属性。
  • to.have.property:判断一个对象是否有指定属性,可以指定属性值。
  • to.have.ownProperty:类似 to.have.property,但只判断对象自身的属性,不包括继承属性。
  • to.contain.all.keys:判断一个对象是否包含指定的所有属性。
  • to.have.lengthOf、to.have.length、to.be.empty:内置了可用于集合型数据类型(比如数组和字符串)的模板。
  • to.deep.equal、to.deep.include:类似于 to.equal 和 to.include,但可以比较值的内部结构,适用于非基础类型的值(比如数组和对象)。

下面是这些方法的用法例子:

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

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

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

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

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

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

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

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

  ---------- ---- -- ----- -------- --------- ------- -- -- -
    --------- ---- ----- -- - ---- ----- --------------------- ---- ----- ---
  ---
---
  1. 异常 matchers

除了上面介绍的 matchers,Chai 还有一些用于判断抛出异常的 matchers,它们包括:to.throw、to.throwError 和 to.throwException。

这些 matchers 用于判断某些操作是否会抛出异常,下面是用法示例:

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

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

在上面的例子中,我们使用 to.throw 和 to.throwError 来判断函数是否抛出了指定类型的异常,并且判断异常是否包含指定的信息。to.throwException 不指定异常类型,只需判断函数是否抛出异常即可。

  1. 链式断言

Chai 的 matchers 可以进行链式断言,这样可以使语句变得更加简洁,下面是一个链式断言的例子:

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

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

在上面的代码中,我们使用了 and 方法来对两个断言条件进行链接。

  1. 总结

Chai 的 matchers 可以帮助我们以一种简洁明了的方式编写断言,其中包含了许多实用的方法,可以满足大部分测试场景的需要。在编写测试时,我们应该选择最合适的 matcher 来编写测试用例,并且尽可能运用链式断言来使代码更加简洁易读。

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


猜你喜欢

  • Fastify 应用中 JWT 无法解码的解决方法

    引言 JWT(JSON Web Tokens)是很多 Web 应用程序中用于进行用户身份验证和授权的流行技术。在 Fastify 应用中,使用 JWT 来加密和解密用户的数据,保护应用程序的安全性。

    1 年前
  • 在 Cypress 中如何使用 axe-core 进行 Web Accessibility 自动化测试?

    随着互联网的发展,Web Accessibility(Web 可访问性)越来越受到重视。在实际项目开发中,保证网站在不同用户群体(如视力障碍者、听力障碍者等)中的可用性是至关重要的。

    1 年前
  • 如何用 ES7 简化 Promise 的写法

    前言 在前端开发中,Promise 是一种常见的异步操作解决方案。它的语法规范简洁明了,但是在实际使用过程中,还是存在一些繁琐的操作。本文将介绍如何使用 ES7 中 async/await 关键字简化...

    1 年前
  • 如何使用 Hapi 插件实现 TCP 连接

    随着互联网的快速发展,越来越多的人开始关注互联网的底层技术。TCP 协议作为互联网传输层协议的核心之一,更是受到了广泛关注。本文将介绍如何使用 Hapi 插件实现 TCP 连接,并给出详细的示例代码,...

    1 年前
  • PM2 进程守护实践总结

    简介 在前端开发中,我们经常需要启动一些 Node.js 后台服务来进行一些异步请求、定时任务、爬虫等操作,但是这些 Node.js 应用的启动、部署、自动重启等操作可能会出现一些问题,为了解决这些问...

    1 年前
  • Server-sent Events的消息推送示例

    Server-sent Events是一种现代的Web API,它允许服务器向客户端推送数据,而无需客户端发起请求。在前端开发中,这种技术尤其有用,因为它可以帮助我们创建实时交互性应用程序。

    1 年前
  • 如何在 React 项目中使用 Web Components?

    为什么使用 Web Components? Web Components 是一种特殊的技术,可以使开发者将其创建的定制化元素在网页上使用和重用。开发者可以用标准的 Web 技术,比如 HTML、CSS...

    1 年前
  • ECMAScript 2021 中的 Array.prototype.flatMap 方法

    前端开发中,数组操作是非常常见的操作。在 ECMAScript 2021 中,新增了一个非常实用的数组操作方法:Array.prototype.flatMap。它可以一次性完成推平数组和映射操作的结合...

    1 年前
  • 如何用 Koa 实现文件下载和上传进度条?

    前言 随着 Web 应用的逐渐普及,文件下载和上传已经成为了 Web 前端开发中常见的需求之一。而实现文件下载和上传进度条,可以给用户更好的体验和反馈。本文将介绍如何用 Koa 实现文件下载和上传进度...

    1 年前
  • 基于 LESS 的 CSS 代码优化技巧

    CSS 代码的优化一直是前端开发者必须要面对的挑战。为了解决这个问题,我们可以使用 LESS 这样的 CSS 预处理器来提高 CSS 代码的可维护性和可读性。下面,本文将为大家分享一些基于 LESS ...

    1 年前
  • OpenCV 性能优化实践:提高图像处理速度的技巧和方法

    OpenCV 是一个流行的计算机视觉库,它被广泛应用于图像处理和机器学习领域。但是,由于图像处理的复杂性和算法的复杂度,OpenCV 应用程序的性能可能会受到限制。

    1 年前
  • 使用 Jest 测试 Angular 应用的组件

    随着前端技术的不断发展和完善,组件化和自动化测试已经成为 Angular 开发中非常重要的一环。前端开发人员需要不断地保证组件的质量并快速验证代码的正确性。在这篇文章中,我们将介绍如何使用 Jest ...

    1 年前
  • Kubernetes 部署 Serverless 应用程序指南

    前言 在当前日益增长的云计算环境下,Serverless 架构在应用开发中逐渐流行。Kubernetes 作为开源容器集群管理工具,有着强大的横向扩展能力,已经成为常用的容器编排工具。

    1 年前
  • ECMAScript 2018 (ES9) 对象扩展的几个好处

    ECMAScript 2018 (ES9) 是 JavaScript 的最新版本,其中包括了许多新特性和语法糖。其中,对象扩展是一个值得我们深入学习的特性,它能够大大简化我们操作对象的流程。

    1 年前
  • 用 async 和 await 区分异步和同步:ECMAScript 2019

    在前端开发中,异步操作是很常见的。JavaScript 语言内置的异步特性让我们可以发起网络请求、处理用户事件、操作 DOM 等操作,而不会阻塞整个应用程序。然而,异步操作也带来了很多复杂性,尤其是在...

    1 年前
  • 在 Next.js 应用中使用 GraphQL Subscriptions 的方法

    GraphQL 是一种用于 API 的查询语言和运行时环境,它旨在提供更高效、强类型和可扩展的API设计方式。而 Next.js 是一种 React 框架,它支持服务器端渲染并提供可靠的开发体验。

    1 年前
  • 使用 Chai 和 Sinon 进行模拟测试时遇到的问题及解决方案

    在前端开发中,模拟测试是非常重要的一环,可以检测代码的健壮性、可维护性和可扩展性。而 Chai 和 Sinon 则是非常流行的 JavaScript 测试框架。本文将介绍在使用 Chai 和 Sino...

    1 年前
  • 如何解决 ESLint 错误:'export default' is not allowed

    如何解决 ESLint 错误:'export default' is not allowed 当我们在编写 JavaScript 代码时,有时候会遇到一些 ESLint 的错误提示,其中常见的一个就是...

    1 年前
  • ES8 中解决 JavaScript 浮点数计算精度问题的方案

    ES8 中解决 JavaScript 浮点数计算精度问题的方案 在开发前端应用程序时,JavaScript 是最受欢迎的语言之一。然而,JavaScript 在浮点数计算中经常出现精度问题,这会导致不...

    1 年前
  • ES7 新增方法:Array.prototype.find、Array.prototype.findIndex

    在 JavaScript 的发展历程中,每个新版本都会新增一些特性和方法。ES7 中的 Array.prototype.find 和 Array.prototype.findIndex 也是其中之一。

    1 年前

相关推荐

    暂无文章