使用 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 之后就爱上了它。我喜欢它的原因如下:
- 设置很简单
- 观看模式很棒
- 当你
console.log
做某事时,它实际上会毫无困难地出现(这对 AVA 来说是个麻烦)。
设置 Jest
首先,您需要安装 Jest。
npm install jest --save-dev
接下来,你需要将测试脚本添加到package.json
文件中。添加test
和test:watch
脚本(分别用于一次性测试和监视模式)会有所帮助。
"scripts": {
"test": "jest",
"test:watch": "jest --watch"
},
您可以选择使用以下格式之一编写测试文件。Jest 会自动为您选择。
js
__tests__
文件夹中的文件- 以 命名的文件
test.js
(例如user.test.js
) - 以 命名的文件
spec.js
(例如user.spec.js
)
您可以随意放置文件。当我测试端点时,我将测试文件与端点放在一起。我发现这样更容易管理。
- routes
|- users/
|- index.js
|- users.test.js
编写第一个测试
Jest 在每个测试文件中都包含describe
、it
和expect
。您无需手动添加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);
});
如果您运行 Jest,您将看到来自 Jest 的失败消息。
npm run test:watch
您可以通过期望来使测试通过1 === 1
。
// This passes because 1 === 1
it("Testing to see if Jest works", () => {
expect(1).toBe(1);
});
这是最基本的测试。它没什么用,因为我们还没有测试任何实际的东西。
异步测试
您需要发送请求来测试端点。请求是异步的,这意味着您必须能够进行异步测试。
使用 Jest 很容易。只需两个步骤:
- 添加
async
关键字 done
完成测试后打电话
它看起来是这样的:
it("Async test", async done => {
// Do your async tests here
done();
});
注意:如果您不知道如何使用它,这里有一篇关于 JavaScript 中的 Async/await 的文章。
测试端点
您可以使用 Supertest 来测试端点。首先,您需要安装 Supertest。
npm install supertest --save-dev
在测试端点之前,您需要设置服务器,以便 Supertest 可以在测试中使用它。
大多数教程都会教您如何listen
在服务器文件中使用 Express 应用程序,如下所示:
const express = require("express");
const app = express();
// Middlewares...
// Routes...
app.listen(3000);
这不起作用,因为它开始监听一个端口。如果你尝试写入多个测试文件,则会收到“端口正在使用”的错误。
您希望允许每个测试文件自行启动服务器。为此,您需要导出app
而不监听它。
// server.js
const express = require("express");
const app = express();
// Middlewares...
// Routes...
module.exports = app;
app
出于开发或生产目的,您可以在不同的文件中收听正常的音频,例如start.js
。
// start.js
const app = require("./server.js");
app.listen(3000);
使用 Supertest
要使用 Supertest,您需要在测试文件中包含您的应用程序和超级测试。
const app = require("./server"); // Link to your server file
const supertest = require("supertest");
const request = supertest(app);
完成此操作后,您就可以发送 GET、POST、PUT、PATCH 和 DELETE 请求了。在发送请求之前,我们需要一个端点。假设我们有一个/test
端点。
app.get("/test", async (req, res) => {
res.json({ message: "pass!" });
});
要向发送 GET 请求/test
,您可以使用.get
Supertest 中的方法。
it("Gets the test endpoint", async done => {
// Sends GET Request to /test endpoint
const res = await request.get("/test");
// ...
done();
});
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();
});
如果您想了解有关 Supertest 的更多信息,可以在此处阅读其文档。
在下一篇文章中,我将向您展示如何发出 POST 请求以及如何在测试文件中连接到 Mongoose。
感谢阅读。本文最初发布在我的博客上。如果您想阅读更多文章来帮助您成为更优秀的前端开发人员,请订阅我的新闻通讯。
鏂囩珷鏉ユ簮锛�https://dev.to/zellwk/endpoint-testing-with-jest-and-supertest-27gf