在 Jest 中使用 Sinon.js 进行测试的示例

简介

近年来,前端开发已经从一种简单传统的“文艺青年”工作变成了一项极具挑战的行业。为了保证代码的质量,开发人员需要编写完整、可靠的测试集以确保其代码的可靠性和正确性。在这个过程中,Sinon.js 和 Jest 是成为最常用的测试框架之一。在本文中,我们将学习如何在 Jest 中使用 Sinon.js 进行测试,并提供示例代码和指导意义。

学习 Sinon.js

Sinon.js 是一个构建和测试 JavaScript 应用程序的独立、独立的 JavaScript 库,它可以轻松地模拟函数、对象和行为。该库由永久免费的开发人员开发,并根据 BSD 许可证进行分发。

Sinon.js 提供了丰富的工具,包括:

  • Spies(间谍程序): 可以用于记录函数的调用,并访问它们的参数和返回值。
  • Stubs(存根):可以重新定义函数并返回所定义的值。
  • Mocks(模拟):可以完全控制对象的行为。

在学习 jest 中使用 sinon.js 前,我们需要了解一些 sinon.js 的常用函数。

Spies

测试中的 Spy 模式可以用于记录函数的调用,并访问它们的参数和返回值。可以使用 sinon.spy() 方法创建一个 Spy,该方法将返回可修改和调用的特殊函数。

示例:

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

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

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

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

在这个例子中,我们创建了一个简单的函数 myFunction,并使用 sinon.spy() 创建了一个名为 spyFunction 的 Spy。我们将调用参数 myFunction 并记录它的调用,这是通过执行 spyFunction(1, 2) 实现的。

注意,Spy 模式记录了函数的每次调用。一旦 myFunction 有两个参数被传递,sinon 将记录“hasConfigCalledOnce”成功。 calledWith 方法则用于验证该方法是否调用并传递参数。最终,结果将是 result 返回函数 myFunction 的值。

Stubs

在测试过程中,有时需要使用 Stub 以便在测试某些代码时重新定义函数并返回所定义的值。可以使用 sinon.stub() 方法重写给定的对象和 / 或原型上的函数,并将其返回所定义的结果。

示例:

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

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

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

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

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

在这个例子中,我们将当前脚本中的 window.myFunction 备份为 stub。 然后,我们使用 stub.returns(XX) 方法重写该函数并将其返回所定义的结果。 myFunction() 实际上是调用 stub 函数,它将返回 10,而不是原始函数 5

Mocks

在 Sinon.js 中,Mock 可以用于完全控制对象的行为。 可以使用 sinon.mock() 方法创建 Mock,样例如下:

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

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

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

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

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

Mock 模式可以完全控制对象的行为。 在这个例子中,我们创建了一个包含一个方法 sum 的对象 calculator。 然后,我们使用 sinon.mock() 创建了一个名为 calculatorMock 的模拟,并期望调用 sum 方法一次,并使用 withArgs 方法传递参数(1, 2)完成调用。 returns(3) 方法将指定函数返回 3 的值。

计算器实现常常是仅用于说明(mock)如何运作的微小应用,收到更先进应用的封装,我们应当尽可能在mock的应用程序中避免使用函数。

在 Jest 中使用 Sinon.js 进行测试

在熟悉了 Sinon.js 的常用函数和 Spy、Stub、Mock 之后,我们可以开始在 Jest 中使用 Sinon.js 进行测试了。

安装和引入

在开始编写测试代码之前,需要安装 Jest 和 Sinon.js。可以使用以下命令安装 Jest 和 Sinon.js:

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

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

在将 Sinon.js 引入到测试文件中时,可以使用以下代码:

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

编写测试用例

在 Jest 中使用 Sinon.js 进行测试非常容易,您只需使用以下示例代码即可:

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

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

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

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

在这个例子中,我们禁用了 Jest 的自动模拟功能和自动模拟文件mock。使用函数的地方, 我们通过引入 Sinon.js 来进行模拟和测试。 这里我们展示了如何使用 Sinon.js 的 Spy、Stub、Mock 构造器在 Jest 中编写谷歌测试代码。

通过 sinon.spy 方法创建 Spy,sinon.stub 方法可以重写给定的对象和 / 或 ES6类的的函数并返回所定义的值。通过 sinon.mock 方法创建 Mock,用于完全控制 ES6-es5对象的行为。

使用 sync-await 和 Sinon.js 等模拟功能可以模拟异步操作。 例如,我们可以使用 Sinon.js 的 sinon.useFakeTimerssinon.useFakeXMLHttpRequestsinon.useFakeServer API 模拟异步操作。

总结

在本文中,我们使用了 Sinon.js 的 Spy、Stub、Mock 等常见 API 的示例,同时展示了如何在 Jest 中进行测试。 使用 Sinon.js 框架增加了单元测试的灵活性和有效性。 通过在 Jest 中的应用,可以轻松地进行测试以确保代码质量和正确性。

希望这篇文章对大家有帮助。 如果您还有其他方面的疑问,请通过评论提交您的问题。 我们将尽快回答。

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


猜你喜欢

  • Jest 在 Node.js 工程中使用教程

    Jest 是 Facebook 开发的一款开源的 JavaScript 测试运行器,既可以用于前端 UI 测试,也可以用于后端 Node.js 项目测试。本文将介绍 Jest 在 Node.js 工程...

    1 年前
  • CSS Reset 实现技巧:轻松搞定适配问题

    对于前端开发者来说,CSS 是一个不可或缺的技能。但是,由于不同浏览器对 CSS 的解释方式不同,导致页面在不同浏览器下显示存在一定差异。这时候,CSS Reset 就可以很好地解决这个问题。

    1 年前
  • Node.js 中如何进行验证码生成与验证操作

    验证码是一种常用的增强安全性的方法,用于防止机器人对网站进行恶意攻击。Node.js 是一种流行的后端开发工具,它可以用于生成和验证验证码。本文将介绍如何使用 Node.js 生成和验证验证码。

    1 年前
  • Fastify 框架与 NestJS 框架对比分析

    前言 随着 Node.js 不断发展壮大,越来越多的开发者开始选择在 Node.js 上开发应用程序。而在 Node.js 上搭建 Web 服务器则需要使用一些框架,其中 Fastify 和 Nest...

    1 年前
  • 利用 ECMAScript 2017 的 Object.values() 方法实现 JavaScript 对象数据的转换及常见问题解决方法

    JavaScript 作为一门弱类型语言,在实际开发中经常需要将对象转换为数组,以便于进行其它操作。在 ECMAScript 2017 的新特性中,又新增了一个 Object.values() 方法可...

    1 年前
  • Promise 封装 Ajax 的正确做法

    在前端的开发中,使用 Ajax 来进行异步请求已经成为了必不可少的一部分。但是我们在实际开发过程中,单独使用原生的 Ajax 会显得非常冗长繁琐,而且在错误处理上也很不方便。

    1 年前
  • 了解 JavaScript:ECMAScript 2016 (ES7) 新特性之 exponentiation operator

    在 JavaScript 这个充满活力的语言中,每年都有新的 ECMAScript 版本发布,其中 ECMAScript 2016 (ES7) 也新增了一些非常有用的新特性,本文将聚焦于其中的 exp...

    1 年前
  • 在 LESS 中制作无限层级的菜单和导航

    前端开发通常需要为网站或应用程序提供用户友好的导航和菜单。在 LESS 中,可以使用嵌套和变量来制作无限层级的菜单和导航。 LESS 变量和嵌套 在 LESS 中,变量用于存储值并使其可重用。

    1 年前
  • CSS Flexbox 实现伸缩性布局及可视化的使用方法详解

    CSS Flexbox(弹性布局)是CSS3中一种新的布局模式,它可以让我们更轻松地实现适应性布局、居中对齐和自适应尺寸等效果,同时它也能很好地适应各种设备的屏幕尺寸,因此已成为前端开发中不可或缺的一...

    1 年前
  • 在 ASP.NET Core 中提高性能的最佳实践

    随着互联网技术不断发展,Web 应用程序的性能变得越来越重要。在 ASP.NET Core 中提高性能不仅可以提高用户体验,还可以降低服务器负载和成本。本文将介绍一些 ASP.NET Core 提高性...

    1 年前
  • 响应式设计中使用 jQuery 实现页面飞入效果

    响应式设计是现代 Web 开发中不可或缺的一项技术,它可以让网站在不同屏幕大小和设备上都能够完美展示。其中一个关键特征是让页面元素动态地改变位置和大小,以适应不同的视口尺寸。

    1 年前
  • React Native 开发中如何处理缓存问题?

    在 React Native 开发中,缓存是一个经常需要考虑的问题。网络请求频繁、数据传输量大,如果不处理好缓存问题,不仅会浪费用户的流量,还会影响应用的性能。本文将介绍 React Native 中...

    1 年前
  • Headless CMS 使用中遇到的授权问题及解决方案

    什么是 Headless CMS? 首先,我们来了解一下什么是 Headless CMS。Headless CMS 是指一个不基于展示层(例如网站或应用)的 CMS;它只负责内容管理的后端逻辑。

    1 年前
  • ES6 中对象的解构赋值具体操作及其使用场景

    1. 什么是对象的解构赋值? 在 ES6 之前,我们要对一个对象进行赋值时,需要逐一指定对象的属性,如下所示: --- ------ - ------ -------- ---- ---- --- -...

    1 年前
  • ECMAScript 2019 中的 Replay 事务实现技巧,简单有效的优化方案!

    在 ECMAScript 2019 中,引入了 Replay 事务实现技巧,这是一种非常简单和有效的优化方案。在本文中,我们将深入探讨这种技巧,包括其如何实现、如何使用以及其对前端开发的影响。

    1 年前
  • 如何在网格布局中实现分页效果?

    最近,越来越多的网站开始使用网格布局(grid layout)来实现页面的布局。在设计网格布局时,有时我们需要在同一页面中实现分页效果。本文将探讨如何在网格布局中实现分页效果。

    1 年前
  • RxJS 中如何使用 BehaviorSubject 实现数据共享

    在前端开发中,数据共享是一个非常重要且必备的特性。RxJS 中的 BehaviorSubject 提供了一种简单、可靠的方式来实现数据共享。本文将介绍RxJS 的 BehaviorSubject,它的...

    1 年前
  • Redis 使用中可能遇到的阻塞问题及解决方法

    Redis 是一款高性能的 NoSQL 数据库,常用于缓存、队列、分布式锁等场景。在使用 Redis 过程中,有时会遇到阻塞问题,例如高并发下的性能瓶颈、卡顿、死锁等,这些问题不仅会影响程序的正常运行...

    1 年前
  • 安装时常见的 ESLint 错误及解决方案

    安装时常见的 ESLint 错误及解决方案 ESLint 是一个开源的 JavaScript 代码检查工具,它可以帮助我们规范我们的代码风格,提高代码的可读性和可维护性。

    1 年前
  • Cypress 自动化测试:如何通过环境变量来配置测试?

    Cypress 是一个基于 JavaScript 的前端自动化测试框架,它可以轻松地模拟用户在浏览器中的操作,并对网页进行效果测试、功能测试和回归测试,从而提高测试效率和代码质量。

    1 年前

相关推荐

    暂无文章