使用 Jest 和 Supertest 进行端点测试

2025-06-10

使用 Jest 和 Supertest 进行端点测试

最近我一直在做一些测试。其中一件事就是测试我的 Express 应用程序的端点。

设置测试是最难的部分。写测试的人其实不会教你如何设置。我找不到任何有用的信息,所以只能自己摸索着弄明白。

所以今天,我想分享一下我自己创建的设置。希望这能帮助你创建自己的测试。

首先,我们来谈谈堆栈。

堆栈

  • 我使用 Express 创建了我的应用程序。
  • 我使用 Mongoose 连接到 MongoDB
  • 我使用 Jest 作为我的测试框架。

你可能以为是 Express 和 Mongoose,因为其他人似乎都在使用这两个框架。我也用过。

但为什么是 Jest 而不是其他测试框架?

为什么使用 Jest

我不喜欢 Facebook,所以不想尝试 Facebook 团队开发的任何产品。我知道这听起来很傻,但事实就是如此。

在 Jest 之前,我尝试过各种各样的测试框架,例如 Tap、Tape、Mocha、Jasmine 和 AVA。每个测试框架都有各自的优缺点。我差点就选择了 AVA,但最终因为设置起来比较麻烦而放弃了。最终,我尝试了 Jest,因为 Kent C. Dodds 推荐了它。

我试用过 Jest 之后就爱上了它。我喜欢它的原因如下:

  1. 设置很简单
  2. 观看模式很棒
  3. 当你console.log做某事时,它实际上会毫无困难地出现(这对 AVA 来说是个麻烦)。

设置 Jest

首先,您需要安装 Jest。

npm install jest --save-dev
Enter fullscreen mode Exit fullscreen mode

接下来,你需要将测试脚本添加到package.json文件中。添加testtest:watch脚本(分别用于一次性测试和监视模式)会有所帮助。

"scripts": {
  "test": "jest",
  "test:watch": "jest --watch"
},
Enter fullscreen mode Exit fullscreen mode

您可以选择使用以下格式之一编写测试文件。Jest 会自动为您选择。

  1. js__tests__文件夹中的文件
  2. 以 命名的文件test.js(例如user.test.js
  3. 以 命名的文件spec.js(例如user.spec.js

您可以随意放置文件。当我测试端点时,我将测试文件与端点放在一起。我发现这样更容易管理。

- routes
  |- users/
    |- index.js
    |- users.test.js
Enter fullscreen mode Exit fullscreen mode

编写第一个测试

Jest 在每个测试文件中都包含describeitexpect。您无需手动添加require它们。

  • describe让你将多个测试整合到一个框架下。(用于组织你的测试)。
  • it让您运行测试。
  • expect允许您执行断言。如果所有断言都通过,则测试通过。

下面是一个测试失败的例子。在这个例子中, Iexpect应该1严格等于2。由于1 !== 2,测试失败。

// This test fails because 1 !== 2
it("Testing to see if Jest works", () => {
  expect(1).toBe(2);
});
Enter fullscreen mode Exit fullscreen mode

如果您运行 Jest,您将看到来自 Jest 的失败消息。

npm run test:watch
Enter fullscreen mode Exit fullscreen mode

终端输出。测试失败。

您可以通过期望来使测试通过1 === 1

// This passes because 1 === 1
it("Testing to see if Jest works", () => {
  expect(1).toBe(1);
});
Enter fullscreen mode Exit fullscreen mode

终端输出。测试成功。

这是最基本的测试。它没什么用,因为我们还没有测试任何实际的东西。

异步测试

您需要发送请求来测试端点。请求是异步的,这意味着您必须能够进行异步测试。

使用 Jest 很容易。只需两个步骤:

  1. 添加async关键字
  2. done完成测试后打电话

它看起来是这样的:

it("Async test", async done => {
  // Do your async tests here

  done();
});
Enter fullscreen mode Exit fullscreen mode

注意:如果您不知道如何使用它,这里有一篇关于 JavaScript 中的 Async/await 的文章。

测试端点

您可以使用 Supertest 来测试端点。首先,您需要安装 Supertest。

npm install supertest --save-dev
Enter fullscreen mode Exit fullscreen mode

在测试端点之前,您需要设置服务器,以便 Supertest 可以在测试中使用它。

大多数教程都会教您如何listen在服务器文件中使用 Express 应用程序,如下所示:

const express = require("express");
const app = express();

// Middlewares...
// Routes...

app.listen(3000);
Enter fullscreen mode Exit fullscreen mode

这不起作用,因为它开始监听一个端口。如果你尝试写入多个测试文件,则会收到“端口正在使用”的错误。

您希望允许每个测试文件自行启动服务器。为此,您需要导出app而不监听它。

// server.js
const express = require("express");
const app = express();

// Middlewares...
// Routes...

module.exports = app;
Enter fullscreen mode Exit fullscreen mode

app出于开发或生产目的,您可以在不同的文件中收听正常的音频,例如start.js

// start.js
const app = require("./server.js");
app.listen(3000);
Enter fullscreen mode Exit fullscreen mode

使用 Supertest

要使用 Supertest,您需要在测试文件中包含您的应用程序和超级测试。

const app = require("./server"); // Link to your server file
const supertest = require("supertest");
const request = supertest(app);
Enter fullscreen mode Exit fullscreen mode

完成此操作后,您就可以发送 GET、POST、PUT、PATCH 和 DELETE 请求了。在发送请求之前,我们需要一个端点。假设我们有一个/test端点。

app.get("/test", async (req, res) => {
  res.json({ message: "pass!" });
});
Enter fullscreen mode Exit fullscreen mode

要向发送 GET 请求/test,您可以使用.getSupertest 中的方法。

it("Gets the test endpoint", async done => {
  // Sends GET Request to /test endpoint
  const res = await request.get("/test");

  // ...
  done();
});
Enter fullscreen mode Exit fullscreen mode

Supertest 会从端点返回响应。你可以res.json像这样测试 HTTP 状态和正文(无论你通过 发送什么):

it("gets the test endpoint", async done => {
  const response = await request.get("/test");

  expect(response.status).toBe(200);
  expect(response.body.message).toBe("pass!");
  done();
});
Enter fullscreen mode Exit fullscreen mode

第一个端点测试通过。

如果您想了解有关 Supertest 的更多信息,可以在此处阅读其文档。

在下一篇文章中,我将向您展示如何发出 POST 请求以及如何在测试文件中连接到 Mongoose。


感谢阅读。本文最初发布在我的博客上。如果您想阅读更多文章来帮助您成为更优秀的前端开发人员,请订阅我的新闻通讯。

鏂囩珷鏉ユ簮锛�https://dev.to/zellwk/endpoint-testing-with-jest-and-supertest-27gf
PREV
我如何记住 CSS 网格属性
NEXT
使用 CSS 检查输入是否为空