在前端开发中,测试是必不可少的一环,它可以大大减少代码出错的概率并提高代码质量。Hapi 是一款流行的 Node.js Web 框架,本文将介绍如何在 Hapi 中进行测试,并分享一些我在测试 Hapi 过程中趟过的坑。
测试框架
在 Hapi 中,可以选择使用任意一种 Node.js 测试框架,比如 Mocha、Jest、AVA 等。这里我们以 Mocha 为例。
首先安装 Mocha:
npm install --save-dev mocha
然后在 package.json 中配置测试脚本:
{
"scripts": {
"test": "mocha --require test/setup.js src/**/*.spec.js"
}
}其中 test/setup.js 文件是用于初始化测试环境的,比如在该文件中可以配置环境变量、连接数据库等。src/**/*.spec.js 是测试文件的路径通配符,可以根据实际情况修改。
单元测试
在 Hapi 中,一般使用 Lab 进行单元测试,它是 Hapi 官方推荐的测试框架。特别是在测试路由和请求处理器时,Lab 非常方便。
首先安装 Lab:
npm install --save-dev lab
然后编写一个 Hapi 路由:
-- -------------------- ---- -------
----- ---- - ----------------------
----- ------ - -------------
----- -----
----- -----------
---
--------------
------- ------
----- ----------------
-------- --------- -- -- -
----- - ---- - - ---------------
------ ------- ----------
-
---
-------------- - -------在 test 目录下新建一个测试文件:
-- -------------------- ---- -------
----- --- - ---------------------
----- - ------ - - ----------------------
----- ------ - -------------------------
----- - --- -------- - - ----------- - -------------
-------------- ----- ------- -- -- -
---------- ------ ------- --------- ----- -- -- -
----- --- - ----- ------------------------------
-------------------------------------
----------------------------------- ---------
---
---该测试文件首先导入 Lab 和 Code,然后导入我们编写的 Hapi 路由。在测试用例中,通过调用 server.inject() 方法模拟 HTTP 请求,然后对响应进行断言。
最后,在终端中执行 npm test 命令,即可运行测试。
集成测试
除了单元测试,还需要进行集成测试,用于验证整个应用的可用性以及各个组件之间的协作。
在 Hapi 中,可以使用 SuperTest 进行集成测试。
首先安装 SuperTest:
npm install --save-dev supertest
然后编写一个 Hapi 应用:
-- -------------------- ---- -------
----- ---- - ----------------------
----- ------ - -------------
----- -----
----- -----------
---
--------------
------- ------
----- ----------------
-------- --------- -- -- -
----- - ---- - - ---------------
------ ------- ----------
-
---
-------------- - -------在 test 目录下新建一个测试文件:
-- -------------------- ---- -------
----- --- - ---------------------
----- - ------ - - ----------------------
----- ------- - ---------------------
----- ------ - -------------------------
----- - --- -------- - - ----------- - -------------
-------------- ----- ------- -- -- -
---------- ------ ------- --------- ----- -- -- -
----- --- - ----- ------------------------
--------------------
-------------
--------------------------------- ---------
---
---该测试文件首先导入 Lab 和 Code,然后导入我们编写的 Hapi 应用。在测试用例中,通过调用 request() 方法模拟 HTTP 请求,然后对响应进行断言。
最后,在终端中执行 npm test 命令,即可运行测试。
陷阱
在测试 Hapi 的过程中,有一些坑需要注意。下面是我遇到的几个问题和解决方案。
使用 ESM
Hapi 17 以上版本已经采用了 ES6 模块化规范,但是很多测试工具还使用 CommonJS 规范,会导致无法加载模块。因此,我们需要使用 ESM 作为测试工具的运行时环境。
首先安装 ESM:
npm install --save-dev esm
然后在 package.json 中配置测试脚本:
{
"scripts": {
"test": "mocha --require esm --require test/setup.js src/**/*.spec.js"
}
}处理 JSON 和 FormData
在测试请求时,有时需要提交 JSON 或 FormData 数据,但是 SuperTest 默认使用 application/x-www-form-urlencoded 格式,需要手动设置 Content-Type。
比如,下面是提交 JSON 数据的测试用例:
const res = await request(server.listener)
.post('/api/users')
.set('Content-Type', 'application/json')
.send({ name: 'John' })
.expect(201);下面是提交 FormData 数据的测试用例:
const res = await request(server.listener)
.post('/api/users')
.field('name', 'John')
.expect(201);处理文件上传
在测试文件上传时,无法直接使用 send() 方法,需要使用 attach() 方法。
比如,下面是上传图片的测试用例:
const res = await request(server.listener)
.post('/api/upload')
.attach('image', 'test/fixtures/image.jpg')
.expect(200);其中 attach() 方法接受两个参数,第一个参数是表单域名称,第二个参数是文件路径。
结语
通过本文的介绍,相信大家已经掌握了如何在 Hapi 中进行单元测试和集成测试,以及一些测试时需要注意的问题。希望本文能给大家带来帮助。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/6780bd4ace7f4861254719b9