强烈建议基于测试驱动开发。测试驱动开发,可以有效沉淀开发成果,当代码出现变更时也能尽快锁定潜在问题,从而显著提升代码的鲁棒性

CabloyJS在EggJS的基础上,提供了一个便捷的框架,可以很方便的实现基于测试驱动的开发

模块test-party

模块test-party是开箱即用的测试模块,提供大量的测试驱动开发指引。包含CabloyJS所有内置核心模块的测试用例,不仅可以验证CabloyJS架构本身的鲁棒性,也可以作为实际业务开发的代码范本

在本教程中,示范了以下几个环节的测试。您可以此为范例,不断扩充测试用例,尽可能多的提高代码覆盖率

  1. 用户登录
  2. 新建party
  3. 提交party(从草稿状态提交到正常状态
  4. 查询party
  5. 删除party

测试代码

src/module/test-party/backend/test/controller/test.test.js

const { app, mockUrl, mockInfo, assert } = require('egg-born-mock')(__dirname);

describe('action: atom: party', () => {
  it('[atom]', async () => {
    app.mockSession({});

    // atomClass info
    const atomClassModule = mockInfo().relativeName;
    const atomClassName = 'party';

    // login as root
    await app.httpRequest().post(mockUrl('/a/authsimple/passport/a-authsimple/authsimple')).send({
      auth: 'root',
      password: '123456',
    });

    // create
    let result = await app.httpRequest().post(mockUrl('/a/base/atom/create')).send({
      atomClass: { module: atomClassModule, atomClassName, atomClassIdParent: 0 },
    });
    assert(result.body.code === 0);
    const atomKey = result.body.data;

    // submit
    result = await app.httpRequest().post(mockUrl('/a/base/atom/submit')).send({
      key: atomKey,
      item: {
        atomName: 'party demo',
        personCount: 3,
      },
    });
    assert(result.body.code === 0);

    // read
    result = await app.httpRequest().post(mockUrl('/a/base/atom/read')).send({
      key: atomKey,
    });
    assert(result.body.code === 0);

    // delete
    result = await app.httpRequest().post(mockUrl('/a/base/atom/delete')).send({
      key: atomKey,
    });
    assert(result.body.code === 0);

  });
});
名称 说明
mockUrl 用于构造完整的后端API接口地址
mockInfo 用于获取当前测试所属模块的基本信息。比如当前模块名是test-party,但为了提升代码的灵活性,可以通过mockInfo().relativeName获取
app.mockSession 用于模拟Session环境

执行测试

$ npm run test:backend

测试覆盖率统计

$ npm run cov:backend