前言
在前端开发中,测试是非常重要的一环。其中,我们需要对后端 API 进行测试来确保其功能的正确性。而对于一些异步请求接口的测试,我们需要使用一些工具来等待其完成,以便我们进行断言验证。在本文中,我们将介绍如何使用 Jest 测试框架来测试 Express 的异步请求,并且演示一些实用的测试技巧。
安装 Jest 和 Express
在开始之前,我们需要先安装 Jest 和 Express。
npm install jest express supertest --save-dev
其中,jest
是测试框架,supertest
是测试辅助工具,express
是我们需要测试的后端框架。
测试异步请求
在开始测试之前,我们需要准备一个简单的 Express 应用程序,用于测试异步请求。我们可以使用以下代码:
-- -------------------- ---- ------- ----- ------- - ------------------ ----- --- - --------- ---------------- ----- ---- -- - ------------- -- - ---------- -------- ------ ------ -- -- ----- -- ----- ---- - ---------------- -- ---- ---------------- -- -- - ------------------- ------- -- ---- --------- -- -------------- - ---
这个应用程序简单地提供了一个 /data
路径,该路径在 1 秒后返回一个 JSON 数据。
我们的测试用例需要测试这个路径是否能成功返回数据。
首先,我们需要创建一个测试用例文件,名称为 test.js
。
在这个文件中引入以下包:
const request = require('supertest') const app = require('./app')
其中,request
是一个提供了方便的 API 请求功能的第三方库,而 app
则是刚刚我们编写的 Express 应用程序。
接着,我们可以编写一个简单的测试用例:
-- -------------------- ---- ------- ------------ ------ ----- ------- ------ -- - ------------ ------------- ------------ ---------- ---- -- - ------------------------------------ ------- ------ -- --
在这个测试用例中,我们使用了 Jest 的 test
函数来定义一个测试。测试的名称是 "should return hello world"
。
在测试代码中,我们使用 request
的 get
方法发送一个 GET 请求,并且设置了一个期望值 expect(200)
,表示我们期望服务器可以正确地响应请求。
在调用 end
方法时,我们传递了一个回调函数 (err, res) => {...}
,在此回调函数中,我们对返回的数据进行了验证。
最后,我们通过调用 done()
函数告诉 Jest,这个测试已经完成。
这是一个非常简单的测试用例,但是我们可以看到,我们使用了 done()
函数来等待服务器返回数据后再进行断言验证。如果我们不等待服务器返回数据,那么测试用例很有可能会出现错误。
使用 async/await
如果您熟悉 TypeScript 或 ES6/ES7,那么您可能已经听说过 async/await。在 Jest 中,我们可以使用 async/await 来等待异步请求的完成。
以下是一个示例代码:
test('should return hello world using async/await', async () => { const res = await request(app).get('/data') expect(res.statusCode).toBe(200) expect(res.body.message).toBe('hello world') })
如您所见,我们只需要将测试用例的定义修改一下,加上 async
关键字,然后使用 await
关键字来等待异步请求的完成即可。
清理和 Mock
在实际的开发中,您可能经常会遇到需要在测试前对某些数据进行清理的情况。
对于这种情况,我们可以使用 Jest 提供的一些 API 来实现。例如,我们可以在测试用例的前后将数据库中所有数据清空:
beforeEach(async () => { await mongoose.connect(process.env.MONGO_URL, { useNewUrlParser: true }) }) afterEach(async () => { await mongoose.connection.db.dropDatabase() await mongoose.connection.close() })
在这里,我们使用了 beforeEach
和 afterEach
函数来分别在测试用例之前和之后执行一些清理操作。在这个示例代码中,我们使用了 MongoDB 数据库,并在 beforeEach
函数中连接了数据库,在 afterEach
函数中清空了数据库中的所有数据。
除了清理数据外,在测试中还可能需要进行 Mock 操作,Mock 可以用来模拟一些行为,方便测试特定的场景。
-- -------------------- ---- ------- ------------ -------- -- ---- -- --------------- ----- -- -- - ----- ---- - --------- ----- --- - - ----- - --- ----- - - ----- --- - -- ----- ---------- - ---------------------------- ----- --------------- ---- ----- ------------------------------- --
在 Jest 中,我们可以使用 jest.fn()
来 Mock 一个函数。在本例中,我们使用了 jest.fn()
来模拟了 next
函数,然后对中间件函数的运行结果进行验证。
总结
在本文中,我们介绍了使用 Jest 测试框架来测试 Express 的异步请求的方法,并且演示了一些好用的测试技巧,包括使用 done()
函数、async/await 和清理、Mock 操作。
在日常开发中,测试是确保代码质量的重要方法。我们希望您能在测试中学到更多的东西,并且在日常开发中更加重视测试工作。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651fc06395b1f8cacd7441d3