對 Egg.js 進行單元測試

前言

優秀的代碼須要有單元測試進行質量保證,每一個測試用例都給應用的穩定性提供了一層保障。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);
  });

})
複製代碼

斷言返回值的 successtruepayloadlength 屬性長度大於 0,固然這須要根據具體的業務來寫,一個 service 可能會有不少的方法,須要儘量多的對這些方法進行測試。函數

最後就是執行測試代碼了post

npm run test
複製代碼

經過命令 npm run test 執行 egg-bin test,或者在 Idea 添加一個測試的 configuration 點擊執行便可,這樣 test 目錄下的全部測試都會運行。運行所有的測試耗時可能會很長或者有時只須要對一個測試文件進行測試,這時經過指定測試文件的路徑便可單元測試

npm run test <TestFilePath>
複製代碼

運行測試的時候會加載 config.unittest.js 裏面的配置,運行完畢,沒有經過的測試會顯示具體的錯誤信息,能夠方便的定位錯誤,若是測試都經過了就會出現測試經過的以及耗時信息測試

test

原文連接

參考

單元測試

相關文章
相關標籤/搜索