如何使用 Chai 和 Sinon 在 NodeJS 项目中对 REST API 进行测试

NodeJS 作为一种流行的服务器端运行环境,其广泛的应用与快速增长的社区开发了许多有用的工具和库。测试是项目开发过程中必不可少的一步,它可以帮助我们发现和修复潜在的错误、提高代码的质量和可靠性。在这篇文章中,我们将介绍如何使用 Chai 和 Sinon 对 NodeJS 项目中的 REST API 进行测试。

Chai 和 Sinon 简介

Chai 是一种 JavaScript 测试框架,它提供了许多断言函数,可以用于编写可读性高的测试代码。Chai 可以与不同的测试框架结合使用,如 Mocha、Jasmine、Karma 等。

而 Sinon 则是一个用于测试 JavaScript 代码的工具库,它可以帮助我们创建 spies、stubs 和 mocks 等测试对象,并提供了丰富的接口帮助我们测试异步代码。Sinon 同样可以与不同的测试框架结合使用。

安装和设置

首先,我们需要安装 Chai 和 Sinon,使用 npm 可以轻松完成安装:

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

安装完成之后,在测试文件中,我们需要引入所需的库:

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

编写测试用例

考虑我们有一个简单的 REST API,它实现了一个 POST 请求,用于创建一条数据。该 API 要求请求体包含一个名为 name 的属性,如果请求体中没有该属性,则返回 400 Bad Request 错误。为了编写测试用例,我们需要构建一个测试文件。

我们可以用 Mocha 作为测试框架,将所有测试用例放在 describe() 函数中,it() 函数用于具体描述每个测试用例:

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

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

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

在第一个测试用例中,我们发送一个包含 name 属性的 POST 请求,期望返回 200 OK;在第二个测试用例中,我们发送一个不包含 name 属性的 POST 请求,期望返回 400 Bad Request。

在执行这些测试用例之前,我们需要为名为 app 的 Express 应用程序编写代码。这部分代码将根据请求处理所有 HTTP 动词和路径,但是现在让我们专注于测试代码。

在测试代码中,我们使用了 supertest 模块来模拟 HTTP 请求并检查响应,该模块可以与所有 NodeJS HTTP 框架一起使用,如 Express、Koa、Hapi 等。

现在,我们运行测试代码,你会发现两个测试用例都通过了!但是,在实际开发中,我们会遇到更复杂的测试情况,例如:如何测试我们的 API 调用了另一个 API、如何测试异步代码等等。

使用 Sinon 生成 Mock 和 Stub

Sinon 的 stub 和 mock 可以帮助我们创建模拟函数和对象,以便测试我们的代码。我们来看一些示例。

在这个例子中,我们有一个处理 GET 请求的代码,它发送了一个请求到另一个 API 并返回响应的 body 部分。在测试时,我们不想调用实际的 API,因此我们可以使用 Sinon stub 来模拟这个 API:

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

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

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

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

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

在此示例中,我们使用了 sinon.stub() 创建了一个模拟函数,函数的返回值是预先设置的 responseBody。在用 request(app).get() 发送实际请求之前,我们拦截了 request.get() 的调用,返回了模拟函数的值。我们使用 .resolves() 以 Promise 形式解析函数的返回值。

在测试中,我们可以断言响应的状态码、body 和模拟函数是否被调用(这里使用了 sinon 的 spy 方法 .calledOnce)。最后,我们需要在 stub 使用完后,调用 restore() 方法,将其还原为 original (该恢复方法在 afterEach() 中同样适用)。

使用 Sinon 来测试异步代码

在测试异步代码时,我们经常会遇到有界面或服务端元素根据一定条件进行渲染或响应,这时候我们可以使用 Sinon.fakeTimers 或 Sinon.useFakeTimers() 方法。

在这个例子中,我们有个处理 PUT 请求的代码,它发送请求到另一个 API,并在 5 秒后返回“成功”。在测试时,我们想确保返回消息在请求之后的准确时间到达。

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

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

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

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

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

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

在这个例子中,我们首先使用 Sinon.useFakeTimers() 方法创建时间模拟器。我们也使用了 defer() 方法来延迟使用的解析,最后使用 clock.tick() 来模拟 5 秒过去的时间。

在发送的 PUT 请求期间,我们使用了 Sinon 的 .resolves() 方法,确定了请求函数返回的业务上的成功。在结束期间我们使用 .restore() 操作将所有 stub 和 clock 恢复。

总结

在这篇文章中,我们介绍了如何使用 Chai 和 Sinon 在 NodeJS 项目中对 REST API 进行测试。我们学习了如何使用 supertest 创建模拟 HTTP 请求,并如何使用 Sinon 来创建模拟函数和对象以及测试异步代码。

测试是软件开发过程中非常重要的一步,可以帮助我们提高应用程序的质量和可靠性。同时,测试也有很大的指导意义,在开发过程中帮助我们发现一些潜在的 bug 和设计问题。希望这篇文章能够帮助你更好地理解和使用 Chai 和 Sinon,以及改善你的代码测试策略。

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


猜你喜欢

  • 在 Kubernetes 中使用 OpenShift 解决 CI/CD 问题

    在现代软件开发中,持续集成和持续交付(CI/CD)已经成为非常重要的环节。随着 Kubernetes 的发展,为了更好地使用 Kubernetes 进行 CI/CD,许多人已经开始使用 OpenShi...

    1 年前
  • Tailwind CSS 详解和使用

    前言 在编写前端样式时,我们通常会遇到大量的 CSS 代码,而这些代码数量庞大,并且需要一定的时间维护,这往往会影响我们的开发效率。因此,Tailwind CSS 就应运而生。

    1 年前
  • 在 ECMAScript 2017 (ES8) 中如何避免闭包的问题

    如果你是一位前端开发者,你肯定已经经历过闭包带来的一些问题了。闭包是一种常见的模式,常常被用来解决作用域的问题,但是也会带来一些难以调试和理解的问题。在 ECMAScript 2017 (ES8) 中...

    1 年前
  • Vue.js 中如何使用 keep-alive 缓存组件状态

    Vue.js 中如何使用 keep-alive 缓存组件状态 一、前言 在我们开发Vue应用的时候,经常会有些组件需要频繁地创建和销毁。但有些情况下,我们希望它们能够保留一些状态,比如用户输入的数据、...

    1 年前
  • 使用 Server-sent Events 实现音视频文件直播播放

    近年来,随着互联网技术的不断发展,直播成为了一种越来越普遍的形式。但是,对于一些不同类型的直播,我们可能需要不同的实现方式。其中,音视频文件直播就是一种比较特殊的形式,需要借助一些特殊的技术来实现。

    1 年前
  • Angular 和 Socket.io 实现实时通信的方法

    随着互联网的发展,实时通信成为了一个非常火热的话题。在前端开发中,使用 Angular 和 Socket.io 技术实现实时通信已经成为了非常流行的做法。本文将会探讨 Angular 和 Socket...

    1 年前
  • ES7 新特性:Array.prototype.at() 方法详解

    在 ES7 中,新增了一个名为 Array.prototype.at 的方法,用于获取数组中指定位置的元素。在这篇文章中,我们将会详细介绍这个新特性,并提供一些实用的示例。

    1 年前
  • Cypress 中使用测试数据带来的优势

    在前端开发过程中,我们需要对代码进行测试以确保质量和稳定性。而测试数据是测试过程中非常重要的一部分,因为它可以帮助我们发现潜在的问题,验证我们的代码是否按照预期工作。

    1 年前
  • 使用 Mongoose 在 Express 中实现文件上传

    在 Web 应用开发中,文件上传是一个基本功能。本文将介绍如何在 Express 中使用 Mongoose 来实现文件上传,让你的 Web 应用能够顺畅处理用户上传的文件。

    1 年前
  • 如何使用 Koa 实现 SSR 应用?

    随着前端技术的发展,越来越多的应用变得复杂,需要后端能力的支持。其中一项最常见的需求是实现服务端渲染(Server-side Rendering,SSR),使前端页面避免出现白屏或 FOUC(Flas...

    1 年前
  • Web Components 中如何实现 a 标签的 href 属性?

    Web Components 是一个基于 Web 标准的技术,它可以帮助开发者构建可复用的自定义组件和元素。在 Web Components 中,a 标签的 href 属性是非常重要的一个属性,它可以...

    1 年前
  • Flexbox 布局实现动态图片墙的方法

    在前端开发中,常常需要展示一些图片墙,比如产品展示页面、新闻列表等等。如何实现一个高效、动态的图片墙是我们需要思考的问题。本文将介绍如何使用 Flexbox 布局来实现一个动态的图片墙。

    1 年前
  • ECMAScript 2020 中的解构参数和扩展运算符简化数组和对象操作

    在前端开发中,常常需要对数组和对象进行操作和处理。在过去的 JavaScript 版本中,我们可能需要编写大量的代码来完成这些操作。而在 ECMAScript 2020 中,解构参数和扩展运算符为我们...

    1 年前
  • Java JMH 的性能优化实验试水

    前言 在开发过程中,我们经常会遇到性能瓶颈问题,这时我们需要进行性能测试和优化,以提高应用程序的运行效率。Java JMH(Java Microbenchmark Harness)是一款专门用于进行 ...

    1 年前
  • Deno 如何进行 MongoDB 操作

    前言 Deno 是一款新兴的 JavaScript 运行时,它具备了一些 Node.js 所没有的特性和改进,例如支持 TypeScript、自带标准库和权限控制等。

    1 年前
  • SASS 中的变量替换技巧

    Sass 中的变量替换技巧 Sass 是一种 CSS 预处理器,可以使 CSS 更加简洁、易于维护和扩展。Sass 中的变量是其最基本、最常用的功能之一,通过变量的使用,可以方便地重复使用颜色、字体、...

    1 年前
  • Angular 中的 HTTP 请求和响应教程

    Angular 是一个流行的前端 JavaScript 框架,它提供了许多功能,其中包括在应用程序中进行网络请求和处理响应。在本文中,我们将介绍如何在 Angular 中发起 HTTP 请求和处理响应...

    1 年前
  • Mocha 测试框架中如何测试 Node.js 中的二进制文件

    简介 Mocha 是一个功能强大的 JavaScript 测试框架。它可以在 Node.js 和浏览器环境中运行,支持异步测试和多种测试报告。Mocha 可以轻松地进行单元测试、集成测试和端到端测试等...

    1 年前
  • Kubernetes 中 Pod 与 Node 的亲和性与反亲和性

    Pod 和 Node 是 Kubernetes 中的两个最基本的概念,其中 Pod 是 Kubernetes 中的最小调度单位,而 Node 是集群中的一台机器。在实际部署中,我们可能要指定 Pod ...

    1 年前
  • 通过使用 Next.js 提高 React 前端应用的 SEO 性能

    背景 React 是一种开源的 JavaScript 库,用于构建用户界面。它由 Facebook 开发,并于 2013 年发布。它的主要优点是实现了组件化开发、虚拟 DOM 和单向数据流,这使得开发...

    1 年前

相关推荐

    暂无文章