2、Controller控制器和单元测试模块

576 阅读2分钟

一、Controller控制器

Controller,也就是控制器,简单说Controller负责解析用户的输入,处理后返回相应的结果。但是由于开发形式的不同,Controller的具体作用还是有一些区别的。

  • RESTful接口中,Controller接受用户的参数,从数据库中查找内容返回给用户或者将用户的请求更新到数据库中。
  • 在HTML页面请求中,Controller根据用户访问不同的URL,渲染不同的模板得到HTML返回给用户。
  • 在代理服务器中,Controller将用户的请求转发到其它服务器上,并将其它服务器的处理结果返回给用户。

官方给的建议是Controller层主要对用户的请求参数进行处理(校验、转换),然后调用对应的service方法处理业务,得到业务结果封装并返回。

自己手写一个Controller

1、在/app/controller目录下,新建一个文件test.js

// 开启严格模式
'use strict';

const Controller = require('egg').Controller;

class TestController extends Controller {
  async index() {
    // 得到上下文,向页面输出
    const { ctx } = this;
    ctx.body = '<h1>首页</h1>';
  }
}

module.exports = TestController;

写完这个Controller后,在浏览器中是没办法访问到的,这时候还需要去配置路由。

2、打开/app目录下的router.js文件,添加路由

router.get('/Test', controller.test.index);

开启服务,访问127.0.0.1:7001/Test即可

二、单元测试模块

写完一个Controller之后,都需要进行单元测试。因为单元测试能够快速发现开发业务逻辑中一些隐藏的问题,越早发现问题,越好解决。

单元测试分为同步单元测试异步单元测试两种

1、同步单元测试

注:Egg框架规定,所有的测试代码,都需要放在/test目录下面,所有的测试文件都需要以.test.js为后缀。

/test目录下新建test.test.js

'use strict';

const { app } = require('egg-mock/bootstrap');

describe('描述自定', () => {

  it('同步', () => {
    return app.httpRequest()
      .get('/Test')
      .expect('<h1>首页</h1>')
      .expect(200);
  });
});

这里的describe( )方法有两个参数,第一个是测试的描述(字符串类型),这个描述一般都是用文件的路径。第二个参数是一个回调函数,里边是对这个控制器里边的具体方法的测试用例。

运行测试命令

npm test

图片.png

2、异步单元测试

异步单元测试,需要有一个异步的Controller方法,/app/controller/test.js中添加编写异步

async test() {
    const { ctx } = this;
    await new Promise(resolve => {
      setTimeout(() => {
        resolve(ctx.body = '<h1>异步测试</h1>');
      }, 5000);
    });
  }

添加对应路由

router.get('/Test2', controller.test.test);

test/app/controller/test.test.js文件中添加异步测试

it('异步', async () => {
    await app.httpRequest()
      .get('/Test2')
      .expect('<h1>异步测试</h1>')
      .expect(200);
  });

运行测试命令

npm test

图片.png

学习日期:2021/12/22

视频参考www.bilibili.com/video/BV1s3…

文档参考jspang.com/detailed?id…

仅供个人学习和记录