区分 Sinon 和 Chai-CPS 的 spy

区分 Sinon 和 Chai-CPS 的 spy

在编写单元测试时,我们经常需要模拟函数和对象的行为。这时候我们会用到 spy 来监视函数或对象的调用情况。常见的 spy 库有 Sinon 和 Chai-CPS。虽然它们都可以实现 spy 的功能,但是在使用过程中需要注意它们之间的区别。

Sinon

Sinon 是一个流行的 JavaScript 测试框架,可用于模拟 HTTP 请求、计时器等等。其中最常用的功能是 mock、stub 和 spy。在 Sinon 中,我们可以使用 spy 监视任何 JavaScript 函数的调用情况,包括对象方法。

创建 spy

通过 Sinon 可以很方便地创建 spy。

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

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

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

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

如何使用

Sinon 的 spy 可以用于断言某个函数是否被调用,以及函数的参数和返回值。spy 有许多监听函数调用的属性和方法,可以用于编写严谨的单元测试。

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

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

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

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

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

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

Chai-CPS

Chai-CPS 是 Chai 的插件,CPS 代表 Continuation-passing style(继续传递风格)。Chai-CPS 提供了一种更加自然的方式来测试异步代码中的函数的行为。 Chai-CPS 的 spy 不同于 Sinon 的 spy,不能直接用于断言函数被调用。

创建 spy

Chai-CPS 的 spy 是通过 wrap 函数来创建的。

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

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

如何使用

Chai-CPS 的 spy 不能直接用于断言函数被调用,而是要用在异步代码中。我们可以通过 wrap 函数来转化异步函数为 CPS 风格的函数,并在其中使用 spy 监视函数的调用情况。

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

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

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

在使用 Chai-CPS 的 spy 时,我们要注意它的使用场景和语法。

总结

Sinon 和 Chai-CPS 都是 JavaScript 中常用的 spy 库。两者的使用场景和语法有所不同。在编写单元测试时,我们要根据需求选择相应的库。在使用时,我们需要注意它们的区别。

示例代码

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

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

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

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

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

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

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

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

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

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

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

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


猜你喜欢

  • Web 组件:使用 Custom Elements 封装功能

    Web 组件是一种 Web 开发技术,它允许开发者通过封装 HTML、CSS 和 JavaScript 代码来创建一组自定义元素,这些元素可以在网页中被复用。Custom Elements 是 Web...

    1 年前
  • 利用 Headless CMS 来管理网站的多语言内容

    在全球化的互联网时代中,拥有一个多语言网站已经成为越来越多企业的需求。然而,对于前端开发者来说,管理网站上的多语言内容会比较麻烦,而 Headless CMS 则成为了一个高效的解决方案。

    1 年前
  • # 详解 ES12 中全局对象 globalThis

    详解 ES12 中全局对象 globalThis 在过去,JavaScript 中访问全局对象的方法因不同的运行环境而异,例如 Node.js 中的全局对象是 global,而浏览器中的全局对象则是 ...

    1 年前
  • 用 Swagger 实现 RESTful API 文档自动生成

    什么是 Swagger? Swagger 是一种规范和工具集,用于设计、构建、记录和使用 RESTful API。它可以让开发者更方便地了解和使用 API,同时也可以提高团队协作效率。

    1 年前
  • 防止 “this” 指向错误的方法:使用 ES11 中的 “this” 值

    防止 “this” 指向错误的方法:使用 ES11 中的 “this” 值 在 JavaScript 中,“this” 可以说是最具争议的关键字之一。它指的是在函数中引用函数调用的对象,但是在不同的情...

    1 年前
  • ESLint 使用教程:从入门到精通

    在前端开发中,我们经常需要面对代码规范及各种潜在的问题,而 ESLint 就是一个能够帮助我们进行代码规范检测的工具。本文将从入门到精通讲解 ESLint 的使用。

    1 年前
  • ES10 之 Object.fromEntries()

    在 ES8 中,我们得到了一个非常实用的新函数 Object.entries(),它可以将一个对象转换为一个二维数组,其中每个键值对都被转换为一个包含两个元素的数组。

    1 年前
  • Redis 实现分布式锁的方案

    前言 在现代的互联网架构中,微服务和服务化架构极为流行。对于这种架构方式,分布式锁作为保持数据的一致性和完整性的重要手段之一,扮演了非常重要的角色。而 Redis 作为一款高性能的 NoSQL 数据库...

    1 年前
  • ES6 新增的 Array.from 方法详解

    在 ES6 中,新增了许多新的特性和方法,其中一个备受关注的是 Array.from 方法。Array.from 方法的作用是将类似数组的对象或可迭代对象转换成真正的数组。

    1 年前
  • 使用 CSS Grid 解决固定宽度布局的问题

    在前端开发中,我们经常需要使用固定宽度布局来实现网页的排版。但是随着设备尺寸的多样化,固定宽度布局会导致在不同屏幕尺寸下页面显示效果不佳,甚至出现排版混乱的情况。那么,如何解决这个问题呢?本文介绍一种...

    1 年前
  • CSS Flexbox 布局解析:justify-content 属性的作用详解

    CSS Flexbox 布局是前端开发者们经常使用的一种布局方式,它使得网页可以更好地适应不同设备和不同分辨率,更好地分配空间。在 CSS Flexbox 布局中, justify-content 属...

    1 年前
  • 如何基于 Babel 和 ESLint 创建 Vue.js 项目

    Vue.js 是一款流行的 JavaScript 框架,用于构建用户界面和客户端应用程序。该框架旨在简化应用程序的开发和维护。然而,在项目开发过程中,我们可能面临一些挑战,如浏览器不兼容性、代码质量和...

    1 年前
  • Cypress 集成测试与 E2E 测试的区别

    在前端开发中,测试是一个非常重要的环节。常见的测试类型包括单元测试、集成测试和 E2E 测试等。其中,E2E 测试是模拟真实用户场景下的操作,可以全面检查页面功能是否正常。

    1 年前
  • HtmlWebpackPlugin 在 Webpack 中的用法详解

    Webpack 是一个常用的前端构建工具,而 HtmlWebpackPlugin 可以让我们在使用 Webpack 进行开发时,自动生成 HTML 文件,并在其中引入打包生成的 JS 和 CSS 文件...

    1 年前
  • # 选择一个更好的 CSS Reset

    选择一个更好的 CSS Reset 在进行前端网页开发时,我们会使用 CSS Reset 来使不同浏览器的默认样式统一,从而更好的进行页面展示。CSS Reset 已经成为了前端开发必备的一部分。

    1 年前
  • Socket.io 在 React 中的使用指南

    什么是 Socket.io Socket.io 是一个 JavaScript 库,让实时双向通信变得容易。它包含了两个部分:服务器部分和客户端部分。服务器部分运行在 Node.js 环境中,客户端部分...

    1 年前
  • TypeScript 编码建议和最佳实践

    TypeScript 是一门由 Microsoft 推出的开源编程语言,它是 JavaScript 的超集,意味着不仅支持 JavaScript 的所有语法和特性,还额外提供了类型注解、接口、泛型等强...

    1 年前
  • AngularJS 的 $scope 和 Controller 的关系详解

    前言 在学习 AngularJS 的过程中,$scope 和 Controller 是两个非常重要的概念。$scope 是一个可以用于页面上展示的对象,它包含了页面上的数据和方法,而 Controll...

    1 年前
  • Web Components 如何为 Web 开发带来革命性变化

    Web Components 是一种创建可复用和可扩展的定制 HTML 元素的技术。它们是由标准 Web API 和新的 HTML 标准规范组成的,而不是任何框架或库。

    1 年前
  • 从零开始搭建 Serverless 应用

    Serverless 是一种新兴的云计算模式,它允许开发者以函数为中心来构建和部署应用程序,而无需管理任何基础设施。通过 Serverless,您可以更快速、更简单地开发和部署应用程序,并且节省更多的...

    1 年前

相关推荐

    暂无文章