Chai 模块的内部实现

Chai是一个流行的JavaScript测试框架,它是一个用构建BDD和TDD测试的断言库。Chai与Mocha配合使用,它可以让测试更加直观且易于理解。本文将会介绍Chai模块的内部实现,它将涉及以下的内容:

  • Chai的安装和常用断言
  • Chai的内部实现
  • 纯Javascript断言的实现

Chai的安装和常用断言

安装Chai非常简单,只需在命令行中执行以下命令:

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

Chai中最常用的断言是expectshould。下面是它们的基本用法:

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


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

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

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

在上面的例子中,我们分别展示了expectshould两种风格的写法。expect式风格是Chai中最常用的风格,因为它可以链式调用多个断言。而should式风格可以将chai的断言添加到Object.prototype上。

Chai的内部实现

Chai的内部实现基于AssertionError异常类,每个异常对象都包含一个message属性来描述期望是什么,实际是什么的值。Chai库的主要构造块是expect的返回对象,它由Expectation类提供。

在Chai中,我们使用的主要是expect()函数。该函数返回了一个Expectation对象,这个对象可以被用于断言的各种调用。

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

Expectation类封装了期望和实际的值,并在需要时将它们传递给assert函数进行比较。每个Expectation对象都要做的任务是构建成一条断言链。

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

Expectation对象会把当前期望对象的链式调用编程数组,并利用Invoke chaining模式将这段期望的链式调用的各种属性最终注入给了Assertion类。其中,Assertion类提供了大多数加载断言的期望值,它是一个有灵活性和易于阅读的工具,如下所示:

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

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

在该构造函数中,断言的目标对象与附加消息和否定标志一起传递进来,除此之外还会有一些可选的计算属性和实用功能,例如不完整的错误输出和对象比较。

Assertion类中的tonot方法分别用来实现断言和反断言。

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

纯Javascript断言的实现

除了Chai可以提供的“expect”、“should”和“assert”之外,纯JavaScript也支持断言这种技术。

下面是一个简单的纯JavaScript断言:

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

使用纯JavaScript可以实现自定义错误,它能得到更加精确的错误描述:

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

虽然Chai提供了更多的断言和表达的语义,但是纯JavaScript断言起来更加轻量级且具有合理的性能。

总结

本文探讨了Chai模块的内部实现。我们简要概括了Chai模块的安装和常用断言,并深入介绍了Chai的实现方式。最后还介绍了一些纯JavaScript断言的实现方式。希望这篇文章可以帮助开发人员更好地使用Chai进行测试,并提供了查看关于测试实现的思考方式。

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


猜你喜欢

  • CSS Flexbox 实现响应式滚动提示的方法

    在现代 Web 开发中,响应式设计已经成为了一个不可或缺的技术。而对于一个网站或应用程序来说,用户体验则是至关重要的。在本文中,我们将探讨如何使用令人惊叹的 CSS Flexbox 技术来实现一个响应...

    1 年前
  • Vue.js 开发中如何使用手势识别库实现手势操作

    在现代 web 开发中,越来越多的应用需要支持手势操作,而手势识别库是实现这一目的的必要工具。Vue.js 作为其中一种流行的前端框架,本文将介绍如何使用手势识别库在 Vue.js 开发中实现手势操作...

    1 年前
  • # PWA 中如何处理同步和异步资源加载问题

    PWA 中如何处理同步和异步资源加载问题 PWA(Progressive Web Apps)是一种新型的 Web 应用程序模型,将网页的优势和 native 应用的优势结合起来,可以实现像应用一样的离...

    1 年前
  • 使用 Contentful 和 Next.js 将 Headless CMS 融入电商渠道

    随着电子商务的发展,业务的复杂性和灵活性越来越大。为了更好地服务用户,管理内容,以及提高运营效率,我们越来越需要用到内容管理系统 (CMS)。常用的 CMS 都是面向 Web 应用,因为 Web 应用...

    1 年前
  • 如何创建无障碍性测量计划?

    随着数字化时代的到来,人们对于网站和应用程序的无障碍访问需求也越来越高。前端工程师在开发网站和应用程序时,需要考虑到无障碍性问题,以确保所有用户都能够平等地获取信息和使用产品。

    1 年前
  • Cypress 自动化测试框架介绍与使用

    Cypress 是一个现代化的前端自动化测试框架,它能够快速地测试 Web 应用程序并提供详细的测试结果和错误信息。它主要被用于单页面应用和 react 应用程序的测试。

    1 年前
  • Express.js 的模板引擎模块 ArtTemplates 的使用详解

    前言 在 web 开发中,常常需要将后端得到的数据通过渲染模板输出到前端展示给用户。而模板引擎模块正是提供了这个功能的工具。本文将详细介绍一款模板引擎模块 ArtTemplates 的使用方法,以及它...

    1 年前
  • Next.js 的 getInitialProps 方法你真的弄懂了吗?

    Next.js 的 getInitialProps 方法你真的弄懂了吗? 如果你正在学习 Next.js 的开发,那么你一定已经听说过 getInitialProps 方法。

    1 年前
  • 常见的 Tailwind CSS 的嵌套问题及解决方法

    当我们使用 Tailwind CSS 来开发我们的前端项目时,会发现在一些情况下嵌套的样式会出现问题。这篇文章将介绍一些常见的 Tailwind CSS 的嵌套问题及解决方法。

    1 年前
  • 如何通过 ES7 特性实现 JS 中的多线程编程

    在前端开发中,JavaScript是最流行的编程语言之一。然而,由于JavaScript是单线程的,因此在处理大量数据和运算密集型任务时,前端开发人员经常会遇到性能问题。

    1 年前
  • Mongoose 中使用中间件处理 database 字段的方法

    介绍 在 MongoDB 中,一个 document 对应一条记录(record),一个 collection 对应一个表(table),而一个 database 通常包含多个 collection。

    1 年前
  • Redux 状态持久化之 Redux-Persist 的使用技巧

    在前端开发中,我们经常使用 Redux 来管理应用程序状态。但是,每次刷新页面后,所有的状态都会被重置。为了解决这个问题,我们可以使用 Redux-Persist 来将状态持久化到本地存储中,以便在下...

    1 年前
  • AngularJS SPA 应用中如何使用 promise 实现异步加载组件

    AngularJS SPA 应用中如何使用 promise 实现异步加载组件 在前端开发中,异步加载越来越被广泛使用,因为它可以显著提高应用程序的性能。AngularJS是一个非常流行的JavaScr...

    1 年前
  • 使用ES6的Promise来解决回调地狱

    在前端开发中,异步操作是非常常见的。比如用户点击了某个按钮,要等待服务器返回数据后再更新页面内容。而在ES5中,异步操作一般使用回调函数来处理。回调函数嵌套过多会导致代码臃肿,且难以维护,这就是所谓的...

    1 年前
  • 解决 Hapi 框架在使用 Handlebars 时出现的 Helper 未找到问题

    背景 Hapi.js 是一款优秀的 Node.js Web 框架,其内置支持 Handlebars 模板引擎,能够方便地进行前后端分离的开发。然而,在使用 Handlebars 时,有时会遇到一个比较...

    1 年前
  • RxJS debounceTime 操作符的实际用例

    RxJS 是一个强大的 JavaScript 响应式编程库,它提供了很多操作符,可以让开发者更加灵活地控制数据流,其中 debounceTime 操作符就是其中之一。

    1 年前
  • Web Components 如何避免父子组件循环引用?

    Web Components 是一种构建可复用的、可组合的 Web 应用程序的方法。它允许我们创建定制化的 HTML 元素和组件。使用 Web Components,我们可以把 UI 拆分成小组件,然...

    1 年前
  • sequelize 使用九宫格对比,ORM 不用愁

    引言 在前端开发中,与数据库打交道的 ORM 库日益普及。Sequelize 是 Node.js 中的一种 ORM 库,用于操作各种 SQL 数据库。本文将列举一些常见的对比,帮助初学者更好地理解 S...

    1 年前
  • Angular 中组件之间的传值方式及优缺点

    在 Angular 开发中,组件之间的数据传递是非常常见的操作。本文将介绍 Angular 中常用的组件之间的传值方式及它们的优缺点。本文中的示例代码基于 Angular 10。

    1 年前
  • 如何解决 MongoDB 写入超时问题

    背景 MongoDB 是一种非关系型的文档数据库,它采用了面向文档的数据模型来存储数据。在前端开发中,我们经常要使用 MongoDB 存储数据,但是在写入数据时,有时会遇到写入超时的问题,影响了业务的...

    1 年前

相关推荐

    暂无文章