在工作中写完一个Controller
之后,都需要进行单元测试。因为单元测试能够快速发现开发业务逻辑中一些隐藏的问题,越早发现问题,越好解决。本文就介绍一下 Egg 中的单元测试。
单元测试分为同步单元测试和异步单元测试两种,先来看同步单元测试。
同步单元测试
Egg 框架规定,所有的测试代码,都需要放在/test
目录下面。如果是Controller
相关的代码就需要放在/test/app/controller
文件夹下面。所有的测试文件都需要以.test.js
为后缀的。
这里要创建一个mybj.test.js
文件,然后编写下面的测试文件。
'use strict'; const { app } = require('egg-mock/bootstrap'); describe('mybj test', () => { it('mybj index', () => { return app.httpRequest() .get('/my') .expect(200) .expect('<h1>I am Mybj</h1>'); }); });
这里的describe()
方法有两个参数,第一个是测试的描述(字符串类型),这个描述一般都是用文件的路径。第二个参数是一个回调函数,里边是对这个控制器里边的具体方法的测试用例。
写完上面的代码之后,在Powershell
输入npm test
就可以运行测试用例了,都是绿色的对号就是通过了单元测试,没通过就是红色的 X。
注意:测试时不要开启 dev。
编写异步方法
写异步单元测试,需要有一个异步的Controller
方法。所以回到回到/app/controller/mybj.js
文件,编写一个新的方法getGirls
的异步方法。
async getMybj(){ const { ctx } = this; await new Promise(resolve => { setTimeout(()=>{ resolve(ctx.body="<h1></h1>") },5000) }) }
我们通过setTimeout()
方法来模拟数据需要 5 秒钟后,才会返回页面结果。
写完这个方法,再到/router.js
里编写对应的路由。
router.get('/getMybj', controller.mybj.getMybj);
之后就可以在浏览器中通过http://127.0.0.1:7001/getGirls
访问这个页面了,可以看到页面 5 秒后才会出现结果,杨幂,正在向你走来
。
异步单元测试
当异步方法写完后,我们再返回到test/app/controller/mybj.test.js
文件。继续编写异步的单元测试。
it('mybj getMybj', async () => { await app.httpRequest() .get('/getMybj') .expect(200) .expect('<h1></h1>'); });
注意的是在代码的第一行,我们加入了一个async
关键字,这就是异步代码测试的关键。
写完这个测试代码,再次回到PowerShell
,输入dev test
进行测试,可以看到这次的测试用时变成了 5000 多毫秒。
总结:本文主要讲了 Egg.js 中的单元测试,讲了一般情况下的同步测试,也讲了异步测试。为了讲异步单元测试,使用setTimeout()
方法,来模拟异步获取数据的情况。