优秀的代码须要有单元测试进行质量保证,每一个测试用例都给应用的稳定性提供了一层保障。html
egg.js 工程的测试代码都是放在工程的 test 目录下,命名的方式为 ${filename}.test.js
,好比我想测试项目的 user
controller
就在 test
目录下新建一个 controller/user.test.js
,同理要测 service
就是建立一个 service
目录,而后就是写具体的测试代码了。npm
假设如今须要对一个 UserService
进行测试,首先在 user.test.js
中引入 egg-mock
模块用来建立一个 app
实例以及一个 ctx
对象,通常在请求接口的时候会在 ctx
对象上携带此次请求的参数和是用户信息,须要在建立 ctx
的时候添加所要的数据,最好的方式是 before
函数中,将这些数据附加到 ctx
上。bootstrap
const { app, assert } = require('egg-mock/bootstrap')
let ctx
before(() => {
ctx = app.mockContext({
user: {
name: 'your-name'
}
})
})
复制代码
若是还须要添加请求头信息,好比用户的 token
能够这样添加app
ctx.request.headers = {
authorization: yourToken
}
复制代码
准备完毕,接下来编写具体的测试代码了,假如 UserService
有一个 create
方法,做用是建立一个新的 user
,参数是请求体传过来的新建用户数据,那么能够这样写测试代码dom
it('create 方法返回新增用户成功信息', async () => {
const data = {
name: 'user name' + Date.now(),
age: parseInt(Math.random() * 60),
gender: Math.random() > 0.5 ? 'male' : 'female'
}
const response = await ctx.service.user.create(data)
assert(response.success === true)
assert(response.payload.length > 0)
})
复制代码
完整的代码async
'use strict';
const { app, assert } = require('egg-mock/bootstrap');
describe('用户服务测试', () => {
let ctx
before(() => {
ctx = app.mockContext({
user: {
name: 'your-name',
},
});
ctx.request.headers = {
authorization: yourToken
};
})
it('create 方法返回新增用户成功信息', async () => {
const data = {
name: 'user name' + Date.now(),
age: parseInt(Math.random() * 60),
gender: Math.random() > .5 ? 'male' : 'female'
};
const response = await ctx.service.user.create(data);
assert(response.success === true);
assert(response.payload.length > 0);
});
})
复制代码
断言返回值的 success
为 true
,payload
的 length
属性长度大于 0,固然这须要根据具体的业务来写,一个 service
可能会有不少的方法,须要尽量多的对这些方法进行测试。函数
最后就是执行测试代码了post
npm run test
复制代码
经过命令 npm run test
执行 egg-bin test
,或者在 Idea
添加一个测试的 configuration
点击执行便可,这样 test
目录下的全部测试都会运行。运行所有的测试耗时可能会很长或者有时只须要对一个测试文件进行测试,这时经过指定测试文件的路径便可单元测试
npm run test <TestFilePath>
复制代码
运行测试的时候会加载 config.unittest.js
里面的配置,运行完毕,没有经过的测试会显示具体的错误信息,能够方便的定位错误,若是测试都经过了就会出现测试经过的以及耗时信息测试