测试您的 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;
查看上述路由,我们看到两个GET
请求:一个针对所有用户,另一个针对选择用户。我们的测试将验证每个GET
请求是否返回状态码200
、json
内容类型,以及是否包含我们希望返回的属性(例如users
、 或user3
)。
设置 Jest 和 SuperTest
首先,我们必须设置测试环境。以下是启动并运行 Jest 和 SuperTest 的步骤。
1.安装依赖项
npm install jest --save-dev
npm install supertest --save-dev
npm install cross-env --save-dev
2. 设置测试环境
要设置测试环境,我们需要调整package.json
Express 应用程序中的文件夹。以下设置允许您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",
}
我们需要 Jest 忽略我们的./node_modules
文件夹,所以我们还需要将这段代码添加到package.json
:
...
"jest": {
"testEnvironment": "node",
"coveragePathIgnorePatterns": [
"/node_modules/"
]
},
...
好的,现在尝试在命令行中运行测试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);
您会注意到我们正在使用requestWithSupertest
,它将每个测试链接到服务器。
获取所有用户
我们首先需要的是初始describe
块,它将容纳我们两个测试。在这个测试中,我们将检查/user
GET 路由的功能。
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')
});
});
在上面的代码中,您会注意到我们添加了await
,requestWithSupertest.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')
});
运行测试
太棒了!我们已经编写了两个测试来验证两个示例GET
路由的功能。现在在命令行中运行测试:
npm test
您应该在我们的测试套件中看到两个通过的测试!
结论
现在,您已经掌握了为 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