前言
在开发 Express.js 应用时,测试是非常重要的,Mocha 是 Node.js 中一个流行的测试框架,本文将介绍如何使用 Mocha 测试 Express.js 应用,并提供一些示例代码。
什么是 Mocha
Mocha 是一个基于 Node.js 的 JavaScript 测试框架,它支持异步测试,可以在浏览器和命令行中运行。Mocha 提供了丰富的 API,让我们可以编写灵活和可读性强的测试代码。
安装 Mocha
使用 npm 安装 Mocha:
$ npm install mocha --save-dev
--save-dev
表示将 Mocha 安装为开发依赖项,这意味着该包仅在开发时使用。
编写测试用例
我们将在一个 Express.js 应用中编写测试用例,首先确保你已经安装了 Express.js:
$ npm install express --save
在 app.js
文件中,我们编写一个简单的 Express.js 应用:
-- -------------------- ---- ------- ----- ------- - ------------------ ----- --- - --------- ------------ ----- ---- -- - --------------- -------- -- ---------------- -- -- - -------------------- --- --------- -- ---- ------- --
这个应用程序只有一个路由 /
,访问该路由将返回字符串 "Hello World!"
。
现在,我们将编写 Mocha 测试用例并测试该应用程序。
在项目根目录中创建 test
目录,然后在该目录中创建 test.js
文件。在文件开头,导入 chai
和 chai-http
模块以及我们的应用程序:
-- -------------------- ---- ------- ----- ---- - --------------- ----- -------- - -------------------- ----- --- - ----------------- ------------------ ------------ ----- -- -- - ---------- ------ ------ ------ -- --- ---- ------- ------ -- - ----------------- --------- ---------- ---- -- - ------------------------------------ ------------------------------------- -------- ------ -- -- --
在测试文件中,我们首先导入 chai
和 chai-http
模块,然后将其作为 Mocha 插件使用。我们还导入了 app.js
文件,以使用我们的 Express.js 应用程序。
在测试用例中,使用 describe
函数将所有测试用例分组,使用 it
函数编写单个测试用例。在每个测试用例中,使用 chai-http
模块向我们的 Express.js 应用程序发起一个 HTTP 请求,然后使用 chai
断言库对响应进行断言。
现在,我们运行测试:
$ npx mocha My App ✓ should return "Hello World" on the root route 1 passing (30ms)
测试运行成功!我们的测试用例测试了根路由并断言应该返回 "Hello World!"
,并且它确实这样做了。
测试路由
在 Express.js 应用程序中,有时还需要定义自定义路由,本节将演示如何测试自定义路由。
首先,定义一个 /test
路由,该路由返回一个 JSON 响应:
app.get('/test', (req, res) => { res.json({ message: 'This is a test route!' }) })
现在我们要在 test.js
文件中测试这个路由,添加以下代码:
-- -------------------- ---- ------- ---------- ------ - ---- ------ -- --- ----- ------- ------ -- - ----------------- ------------- ---------- ---- -- - ------------------------------------ --------------------------- -------------------------------------------- -- - ---- -------- ------ -- --
在测试用例中,使用 chai.expect(res.body.message)
断言 res.body.message
是否等于字符串 "This is a test route!"
。
测试 POST 请求
我们也可以测试 POST 请求,例如,在 app.js
文件中定义一个路由,该路由接受 POST 请求并将数据保存到数据库中:
-- -------------------- ---- ------- ----------------- ----- ---- -- - ----- - --------- ----- - - -------- -- ------------------- -- --------------- ---------- -------- ----- ------- -------------- -- --
现在,我们在测试用例中添加以下代码:
-- -------------------- ---- ------- ---------- ------ - ---- ------ -- --- ----- ----- ---- - ------- -- ----- ------- ---------------- ------ -- - ----------------- -------------- ------- --------- ---------- ------ --------------------- -- ---------- ---- -- - ------------------------------------ -------------------------------------------- ------- --------------- ------ -- --
在测试用例中,使用 chai.request(app).post('/user')
发送一个 POST 请求,并使用 .send()
方法向请求体中添加数据。然后,使用 .end()
方法结束请求并在回调函数中检查响应。
测试异步代码
在有些情况下,我们需要测试异步代码,例如,在 app.js
文件中定义的路由,该路由向外部 API 发送请求并使用结果更新数据库:
-- -------------------- ---- ------- ------------------ ----- ---- -- - ---------------------------------- ----- --------- ----- -- - -- ----- - ---------------------- -------- ------ -------- --------- -- ------ - -- ------------- ---------- -------- --------- ------- ------------- -- -- --
这个路由向外部 API 发送请求,并在获取响应后更新数据库。由于 JavaScript 中的异步问题,我们不能在请求被完全处理之前测试路由响应,因此需要使用 Mocha 的异步处理功能。
在测试用例中,使用 done
函数标记该测试用例为异步测试,如下所示:
-- -------------------- ---- ------- ---------- ------ - ---- ------ -- --- ------- ----- ---- - ------- -- --------- ------- --------------- ------ -- - ----------------- --------------- ---------- ---- -- - ------------------------------------ ------------------------------------------------ ------- -------------- ------ -- --
注意,在回调函数中使用 done()
函数通知 Mocha 该测试用例已经完成。
结论
本文介绍了如何使用 Mocha 测试 Express.js 应用程序,从编写测试用例到测试自定义路由和测试异步代码,本文提供了完整而详细的教程。Mocha 是一个流行的 Node.js 测试框架,可以帮助我们编写可读性强,灵活的测试用例。
示例代码:https://github.com/wgpython/mocha-express-example
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674c03dd14b275ea6fdfffee