優秀的代碼須要有單元測試進行質量保證,每一個測試用例都給應用的穩定性提供了一層保障。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
裏面的配置,運行完畢,沒有經過的測試會顯示具體的錯誤信息,能夠方便的定位錯誤,若是測試都經過了就會出現測試經過的以及耗時信息測試