当你构建一个基于 Node.js 的 RESTful API 时,测试是非常重要的一环。Chai 和 SuperTest 是常用的两个测试框架,它们可以在 Node.js 项目中进行集成测试和行为测试。本文主要介绍如何使用这两个框架来测试 Node.js RESTful API。
准备工作
为了进行测试,我们需要一个运行的 Node.js 服务器和一个 RESTful API。本文将以一个模拟的“收藏夹”应用为例,包含以下功能:
- 添加一个新的收藏夹
- 获取所有的收藏夹
- 获取单个收藏夹
- 更新一个收藏夹
- 删除一个收藏夹
首先,我们需要安装以下依赖:
express
: 表示我们的 API 服务器body-parser
: 解析请求的内容cors
: 跨域处理mongoose
: 操作 MongoDB 数据库
npm install express body-parser cors mongoose
并在项目中创建一个 api.js
文件:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- ---- - ---------------- ----- -------- - -------------------- ----- --- - ---------- -- -- ---- --- --------------------------- ---------------- -- -- ------- --- ---------------------------------------------------------- - ---------------- ----- ------------------- ----- --- ----- ---------------- - --- ----------------- ----- ------ --- ----- ---------- - ---------------------------- ------------------ -- --------- --------------------------- ----- ----- ---- -- - ----- ---------- - --- ------------ ----- ------------- --- ----- ------------------ --------------------- --- -- -------- -------------------------- ----- ----- ---- -- - ----- ----------- - ----- ------------------ ---------------------- --- -- ------- ------------------------------ ----- ----- ---- -- - ----- ---------- - ----- ----------------------------------- --------------------- --- -- ------- ------------------------------ ----- ----- ---- -- - ----- ---------- - ----- ----------------------------- -------------- - ----- ------------- -- - ---- ---- - -- --------------------- --- -- ------- --------------------------------- ----- ----- ---- -- - ----- ---------- - ----- -------------------------------------------- --------------------- --- -- ----- ---------------- -- -- - ------------------- ---------- ---
接下来,我们要在测试代码中引用 Chai 和 SuperTest。
npm install --save-dev supertest chai
开始测试
对于 RESTful API 的测试可以分成两种:
- 集成测试:测试服务器和数据库的连接是否正常以及各个功能是否正常工作。
- 行为测试:测试 API 的行为是否符合预期,例如返回正确的状态码和响应内容。
集成测试
集成测试需要使用 SuperTest 发送 HTTP 请求到我们的 API,并比较返回的结果和我们预期的结果是否一致。为了保证测试的可靠性,我们可以使用一个空数据库来进行测试。在测试代码的前面,我们需要先连接到测试数据库并清除所有的数据。
-- -------------------- ---- ------- ----- -------- - -------------------- -- ------- --------------------------------------------------------------- - ---------------- ----- ------------------- ----- --- -- -------------- ---------------- -- -- - ----- -------------------------------------- ---
下面编写一个测试用例,测试添加收藏夹功能。我们期望服务器返回刚刚添加的收藏夹对象并且数据库中存在该对象。
-- -------------------- ---- ------- ----- ------- - --------------------- ----- --- - ----------------- ----- ------ - ----------------------- -------------- ------------- -- -- - -------- - --- ------------ ----- -- -- - ----- --- - ----- ------------------------------------------- ----- ----- ------------ --- ---------------------------------- ----------------------------------------- ----- ---------- - ----- -------------------- ---- ------------ --- ---------------------------------- ----------------------------------- ------------- --- ---
我们先使用 SuperTest 发送 POST
请求到 /api/collection
,并在请求体中添加 name
属性。接着,我们检查返回的状态码是否为 200
,以及服务器返回的收藏夹对象是否有 _id
属性。
最后,我们在数据库中查找刚刚添加的收藏夹并验证其属性是否正确。
同理,我们还可以编写其它测试用例,例如测试获取所有收藏夹功能是否正常:
-- -------------------- ---- ------- ------------- ------------- -- -- - -------- --- ------------- ----- -- -- - ----- ------------------- ----- ----------- -- --- ----- ------------------- ----- ----------- -- --- ----- --- - ----- ------------------------------------ ---------------------------------- ------------------------------------- ------------------------------------------ ---- ------------------------------------------ ---- --- ---
行为测试
行为测试用于测试 API 返回的状态码和响应内容是否符合预期。我们可以使用 Chai 提供的 expect
函数检查返回值是否和我们期望的相符。
describe("POST /collection", () => { it("returns 400 Bad Request when name is missing", async () => { const res = await request(app).post("/api/collection").send({}); expect(res.statusCode).equal(400); expect(res.body.error).to.equal("Name is required"); }); });
我们期望当请求体中没有 name
属性时,服务器返回状态码 400
,并且返回值包含一个 error
属性,其值为 "Name is required"
。
同理,我们还可以编写其它测试用例,例如测试更新收藏夹数据是否成功:
-- -------------------- ---- ------- ------------- ----------------- -- -- - ----------- - ------------ ----- -- -- - ----- ---------- - ----- ------------------- ----- ----------- -- --- ----- --- - ----- ------------ ----------------------------------------- ------- ----- -------- ----- --- ---------------------------------- ----- ----------------- - ----- -------------------- ---- -------------- --- --------------------------------------------- ------- --- ---
总结
本文介绍了如何使用 Chai 和 SuperTest 对 Node.js RESTful API 进行测试,涉及到的知识点包括安装和配置测试框架、集成测试和行为测试的编写。在实际开发中,我们应该根据项目的实际情况编写相应的测试用例,确保我们的代码质量和功能正确性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651ce00d95b1f8cacd4617a3