egg如何写单元测试

优秀的代码需要有单元测试进行质量保证,每个测试用例都给应用的稳定性提供了一层保障。

测试目录结构

我们约定 test 目录为存放所有测试脚本的目录,测试所使用到的 fixtures 和相关辅助脚本都应该放在此目录下。

测试文件的目录和我们需要测试的文件目录必须保持一直

测试脚本文件统一按 ${filename}.test.js 命名,必须以 .test.js 作为文件后缀。 一个应用的测试目录示例:

javascript 复制代码
test
├── controller
│   └── home.test.js
└── service
  └── user.test.js

测试运行工具

统一使用 egg-bin 来运行测试脚本, 自动将内置的 Mocha、co-mocha、power-assert,nyc 等模块组合引入到测试脚本中, 让我们聚焦精力在编写测试代码上,而不是纠结选择那些测试周边工具和模块。

javascript 复制代码
"scripts": {
    "test": "egg-bin test",
    "cov": "egg-bin cov"
}

egg单元测试

Egg框架规定,所有的测试代码,都需要放在/test目录下面。如果是Controller相关的代码就需要放在/test/app/controller文件夹下面。所有的测试文件都需要以.test.js为后缀的。

首先我们看下router.js中的接口

javascript 复制代码
  // HOT
  router.get('/api/hots', controller.hot.findHots); // 获取所有热门资讯
  router.post('/api/hots', controller.hot.addHot); // 添加热门资讯
  router.put('/api/hots/:id', controller.hot.editHot); // 编辑热门资讯
  router.delete('/api/hots/:id', controller.hot.delHot); // 删除热门资讯

然后创建一个hot.test.js文件,编写下面的测试文件。

javascript 复制代码
'use strict';

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

describe('test/app/controller/hot.test.js', () => {
  it('should GET /api/hots', () => {
    return app.httpRequest()
      .get('/api/hots') // GET 请求
      .expect(200);
  });
  it('should POST /api/hots', async () => {
    return app.httpRequest()
      .post('/api/hots')
      .send({
        title: '第一个热门资讯',
        description: '今天青岛做网站在使用MySQL数据库做项目时突然遇到提交数据提示Field xxx doesn't have a default value这个错误',
        linkUrl: '/about/news/1289',
        sort: 4,
      })
      .expect(200);
  });
  it('should PUT /api/hots/:id', async () => {
    return app.httpRequest()
      .put('/api/hots/:id')
      .send({
        id: 7,
        title: '第一个热门资讯',
        description: '今天青岛做网站在使用MySQL数据库做项目时突然遇到提交数据提示Field xxx doesn't have a default value这个错误',
        linkUrl: '/about/news/1289',
        sort: 4,
      })
      .expect(200);
  });
  it('should DELETE /api/hots/:id', async () => {
    return app.httpRequest()
      .delete('/api/hots/:id')
      .send({
        id: 7,
      })
      .expect(200);
  });
});

执行npm test,就可以开启测试了。

相关推荐
Suchadar12 小时前
源码编译Apache
apache
大黄说说17 小时前
测试金字塔的实战演进:单元测试、集成测试与系统测试的深度解析与高效落地
log4j
Code_LT17 小时前
【AIGC】Claude Code 模型配置详解
log4j·aigc
Lyyaoo.19 小时前
Spring Boot日志
spring boot·缓存·单元测试
Welcome_Back19 小时前
SpringBoot后端开发测试全指南
spring boot·后端·log4j
一字白首19 小时前
小程序组件化进阶:从复用到通信的完整指南DAY04
前端·小程序·apache
bug攻城狮20 小时前
为什么 Spring Boot 要单元测试?
spring boot·后端·单元测试
专注_每天进步一点点2 天前
mysql-connector-j(8.0 及以上版本,包括你使用的 8.3.0)并非采用 GPL 许可证,因此你在项目中引入该依赖时,不需要遵循 GPL 的开源要求(比如开源你的整个项目)
数据库·mysql·apache
不爱学英文的码字机器2 天前
Apache RocketMQ+cpolar 让消息服务全网可达
apache·rocketmq
kkkkkkkkl242 天前
Prompt 不只是提问:大模型的“输入程序”机制解析
log4j