测试您的 Express.js 后端服务器

2025-06-09

测试您的 Express.js 后端服务器

最近我一直在学习 Node,并使用 Express 构建后端 API 服务器。Express.js 允许使用类似于 Ruby on Rails 的 MVC 模式来构建 RESTful CRUD API(对我来说是一个很好的学习过渡)。在学习如何使用 Express 实现所有 CRUD 部分的过程中,我想测试一下这些功能,确保一切正常。这篇博文将解释如何使用 Jest 框架和 SuperTest 库来测试 Express 后端 API 中路由的 CRUD 功能。

Express 服务器

我假设您已经为本文运行了 Express 服务器,但下面是一个简单的示例应用程序,用于运行本文中的测试(下面我将分享一些关于构建 Express 服务器的附加文章)。在下面的代码中,您将找到两个示例GET端点,以及一些示例代码,它们可以让您了解您的路由在进一步构建后的实际样例。

// server.js
import express from 'express';
const app = express();

app.get('/users', function(req, res) {
  res.json({ users: 'allUsers' });

  // Real code from my application below
  //  model.User.findAll().then (users => {
  //        res.status(200).json({ users });
  //     }).catch(error=>{
  //        console.log(error)
  //        req.status(500).send(error)
  //  })
});

app.get('/users/3', function(req, res) {
  res.json({ user: 'user3' });

  // Real code from my application below
  // const { id } = req.params;
  //    model.User.findOne({
  //        where: { id: Number(id) }
  //    }).then(user=>{
  //        res.status(200).json({ user });
  //    }).catch(error=>{
  //        console.log(error)
  //        req.status(500).send(error)
  //    })
});

export const server = app;
Enter fullscreen mode Exit fullscreen mode

查看上述路由,我们看到两个GET请求:一个针对所有用户,另一个针对选择用户。我们的测试将验证每个GET请求是否返回状态码200json内容类型,以及是否包含我们希望返回的属性(例如users、 或user3)。

设置 Jest 和 SuperTest

首先,我们必须设置测试环境。以下是启动并运行 Jest 和 SuperTest 的步骤。

1.安装依赖项
npm install jest --save-dev
Enter fullscreen mode Exit fullscreen mode
npm install supertest --save-dev
Enter fullscreen mode Exit fullscreen mode
npm install cross-env --save-dev
Enter fullscreen mode Exit fullscreen mode
2. 设置测试环境

要设置测试环境,我们需要调整package.jsonExpress 应用程序中的文件夹。以下设置允许您npm test在 CLI 中运行,它将每次重置测试数据库,并迁移和播种数据库,以便进行准确的测试。

  • 注意NODE_ENV=test用于指定测试环境。
// package.json
 "scripts": {
    ...
    "test": "cross-env NODE_ENV=test jest --testTimeout=10000",
    "pretest": "cross-env NODE_ENV=test npm run migrate:reset",
    "migrate:reset": "npx sequelize-cli db:migrate:undo:all && npm run migrate",
    "migrate": "npx sequelize-cli db:migrate && npx sequelize-cli db:seed:all",
  }
Enter fullscreen mode Exit fullscreen mode

我们需要 Jest 忽略我们的./node_modules文件夹,所以我们还需要将这段代码添加到package.json

...
 "jest": {
    "testEnvironment": "node",
    "coveragePathIgnorePatterns": [
      "/node_modules/"
    ]
  },
...
Enter fullscreen mode Exit fullscreen mode

好的,现在尝试在命令行中运行测试npm test。既然我们已经启动并运行了测试环境,我们应该可以开始编写测试了!

编写测试

我们将在一个新文件中工作test.js,我们的目标是测试GET上述两个请求的功能:
/users/users/3

进口

我们首先需要导入一些依赖项,以便测试我们的 Express 服务器。这些依赖项位于文件顶部test.js

//test.js

const server = require('../index.js');
const supertest = require('supertest');
const requestWithSupertest = supertest(server);
Enter fullscreen mode Exit fullscreen mode

您会注意到我们正在使用requestWithSupertest,它将每个测试链接到服务器。

获取所有用户

我们首先需要的是初始describe块,它将容纳我们两个测试。在这个测试中,我们将检查/userGET 路由的功能。

describe('User Endpoints', () => {

  it('GET /user should show all users', async () => {
    const res = await requestWithSupertest.get('/users');
      expect(res.status).toEqual(200);
      expect(res.type).toEqual(expect.stringContaining('json'));
      expect(res.body).toHaveProperty('users')
  });

});
Enter fullscreen mode Exit fullscreen mode

在上面的代码中,您会注意到我们添加了awaitrequestWithSupertest.get('/users')因为我们正在测试一个需要在继续执行之前完成的承诺。然后,我们期望看到200状态、json内容类型,以及响应主体具有users属性。这三个期望满足了我们想要在此路由功能中测试的内容。

通过 ID 获取用户

好的,我们已经写好了第一个测试。现在,我们将进行第二个测试,做一个类似的测试,这次的目标是/users/3路由。这个测试旨在展示如何测试针对目标用户 ID 的 GET 路由。这个测试也将放在我们上面定义的同一个describe代码块中。

  it('GET /user/:id should show a user', async () => {
        const res = await requestWithSupertest.get('/users/3')
        expect(res.statusCode).toEqual(200)
        expect(res.body).toHaveProperty('user3')
    });
Enter fullscreen mode Exit fullscreen mode
运行测试

太棒了!我们已经编写了两个测试来验证两个示例GET路由的功能。现在在命令行中运行测试:

npm test
Enter fullscreen mode Exit fullscreen mode

您应该在我们的测试套件中看到两个通过的测试!

结论

现在,您已经掌握了为 Express API 添加测试所需的资源!希望以上示例能帮助您初步了解如何设置和测试 Express 服务器的功能!我想扩展我对测试 Express 后端 API 请求的知识,以下是我在自己的应用程序中设置测试的方法!

我使用了一些额外的资源来帮助我学习 Express.js 以及如何测试服务器,包括
bezkoder 编写的 Express、Sequelize 和 MySQL 的 Node.js Rest API 示例、
Bruno Galvao 编写的用 Sequelize CLI 和单元测试构建 Express API!、
Coderslang 编写的如何使用 Jest 和 Supertest 测试 Express.js 后端、
Hopscotch.io - 一种发送服务器请求和查看响应的工具。


这篇文章是否帮助你开始测试你的 Express 服务器?欢迎留言评论或提出建议!

鏂囩珷鏉ユ簮锛�https://dev.to/lukekyl/testing-your-express-js-backend-server-3ae6
PREV
2023 年 7 个开源 AI 项目将加速编码🧑‍💻🚀 更多 AI 项目
NEXT
每个程序员必读的五本书!📚 每个程序员必读的五本书!