在 Node.js 开发中,HTTP API 的测试是十分重要的一步。手动测试虽然可以验证 API 是否能够按照预期的方式工作,但是,一旦要接受 API 的调整或更改,将需要大量的人力和时间。所以,利用测试框架可以节省大量的开发周期和人力成本。
Chai-HTTP 是一个在 Node.js 平台上进行 HTTP API 测试的简单实用的库。它完全建立在 Chai 这个功能强大的断言库之上,可以为我们提供各种请求和响应的基础结构方法,从而轻松地创建和调试 API 测试。
安装 Chai-HTTP
使用 npm 安装包管理器,可以轻松地在您的 Node.js 项目中安装 Chai-HTTP:
npm install chai chai-http --save-dev
安装完成后,可以在你的测试代码中引用 Chai 和 Chai-HTTP:
const chai = require('chai');
const chaiHttp = require('chai-http');
chai.use(chaiHttp);发送 HTTP 请求
使用 Chai-HTTP 中的 chai.request 方法可以方便地进行 HTTP 请求。可以设置请求的地址、HTTP 方法、请求头、请求体等,并执行请求。在比较请求结果时,可以使用 Chai 中定义的丰富的语法来断言结果,具有清晰明了的表达方式。
chai.request('http://localhost:3000')
.get('/users')
.end(function(err, res) {
expect(res).to.have.status(200);
expect(res.body).to.be.an('array');
});上面的代码中,我们使用了 chai.request() 方法构造了 HTTP GET 请求。其中,请求参数包括请求的 URL (http://localhost:3000/users) 和路径 (/users)。
请求完成后,我们可以使用 .end() 回调方法来获取请求的结果,并对其进行验证。例如,我们使用 .expect() 方法来断言返回的状态码是否为 200,并使用 .expect() 方法验证返回的数据类型是否为数组。
发送带有请求参数的 HTTP GET 请求
在 HTTP GET 请求中,参数通常是通过查询字符串(urlencoded)的形式发送的。在 Chai-HTTP 中,我们可以使用简单的链式 API 构建查询字符串并传递到请求中。例如:
chai.request('http://localhost:3000')
.get('/users')
.query({ name: 'Tom', age: 26 })
.end(function(err, res) {
expect(res).to.have.status(200);
expect(res.body).to.be.an('array');
});这里我们将两个查询参数 name 和 age 附加到请求中,并使用 .query() 方法将它们包含在请求中。
发送 HTTP POST 请求
与 HTTP GET 不同,HTTP POST 允许在请求主体中传递参数。在 Chai-HTTP 中,我们可以使用 .send() 或者 .set() 方法来构造请求主体并在请求中发送。例如:
chai.request('http://localhost:3000')
.post('/users')
.send({ name: 'Tom', age: 26 })
.end(function(err, res) {
expect(res).to.have.status(201);
expect(res.body).to.be.an('object').that.has.all.keys('id', 'name', 'age');
});在上面的例子中,我们使用 HTTP POST 请求来将用户的名称和年龄添加到应用程序的数据库中。使用 .send() 方法传递请求主体数据,并使用 .set() 方法设置请求头。请求完成后,我们可以使用 .end() 回调方法对请求结果进行验证,例如检查响应是否返回成功、返回对象是否是一个具有全部键的对象等。
发送 HTTP PUT 请求
与 HTTP POST 类似,HTTP PUT 请求允许在请求主体中传递数据。使用 .send() 方法传递请求主体数据,并使用 .put() 方法来构造 HTTP PUT 请求。例如:
chai.request('http://localhost:3000')
.put('/users/123456')
.send({ name: 'Tom', age: 27 })
.end((err, res) => {
expect(res).to.have.status(200);
expect(res.body).to.be.an('object').that.has.all.keys('id', 'name', 'age');
});在上面的例子中,我们使用 HTTP PUT 请求更新用户数据。使用函数 chai.request('http://localhost:3000').put('/users/123456') 中的请求路径来确定将要更新的数据。使用 .send() 方法传递请求主体数据。
发送 HTTP DELETE 请求
与 HTTP PUT 和 POST 不同,HTTP DELETE 请求不使用请求主体。在 Chai-HTTP 中,我们可以使用 .delete() 方法来构造 HTTP DELETE 请求,例如:
chai.request('http://localhost:3000')
.delete('/users/123456')
.end((err, res) => {
expect(res).to.have.status(200);
});在上面的例子中,我们使用 HTTP DELETE 请求来删除用户数据。使用函数 chai.request('http://localhost:3000').delete('/users/123456') 中的请求路径来确定将要删除的数据。
结论
使用 Chai-HTTP 可以轻松地测试一个 Node.js HTTP API。它完美地集成了 chai 断言库,构建 HTTP 请求和对响应的断言验证过程中,提供了很多的 API。在使用 Chai-HTTP 进行测试时,你可以通过 chaining 的链式 API 在构造请求和断言的过程中完全控制测试的过程。这使得测试开发更加简单现,让你可以更有效地测试 HTTP API。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/670a1df9d91dce0dc87ee372