对 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

原文连接

参考

单元测试

相关文章
相关标签/搜索