之前用React全家桶和Java的SpringBoot重构了自己的个人博客,虽然做出来了,但是还是初成版,自我感觉还是存在很多问题。由于对Java不是完全熟悉,所以写出来的接口可能有些瑕疵,所以最近学习了eggjs,使用了egg重写了后台接口。
项目
项目地址:https://github.com/k-water/egg-blog(喜欢的请点个star^_^)
运行
#1
git clone https://github.com/k-water/egg-blog.git
#2
cd egg-blog
npm install
#3
修改config.default.js中sequelize的配置
mysql的账号密码改为自己的
#4
npm run dev
流程
参考文档
技术选型
后台框架:Egg 数据库:Mysql 插件:egg-sequelize
接口测试
工具:PostMan
数据库设计
数据库设计跟之前的也略有不同,差别的是各实体之间的联系。 实体有
- blogs
- comments
- users
- catalogs
- authorities(用户角色)
ER图如下
实体之间联系
开发的接口
个人总结
基于学习的态度,重写了博客的后台接口,总的来说,egg使用起来还是挺方便的,官方文档写的也很好,基本遇到问题都能在官方issue找到类似的回答,写起来有点像Java的感觉。 这次让我学习到的是,基础要扎实,像数据库的设计这方面,如果学不好,那一开始也无法下手,写出来的接口肯定也是不够好,因为要考虑返回数据格式的问题,什么接口返回什么格式等等。所以基础还是很重要的,之前学的时候一直认为没什么用,反正我又用不到,但是在实践中才发现,这些技能都是需要具备的,干起活来才能事半功倍。另外一点就是要仔细阅读文档,不要急于下手写代码,对一个框架有了初步的掌握,才去下手,那样遇到问题也能快速定位到错误的位置。 以上,就是个人的小小体会啦~
接口文档
学习一下
赞,接口测试为啥不直接用单元测试?
@atian25 单元测试这方面还比较弱,正在学习中
@k-water 看下文档,这块非常的简单
@atian25 好的 看完实践一下
文档地址:https://eggjs.org/zh-cn/core/unittest.html
举个例子:
有业务代码:
// app/router.js
module.exports = app => {
const { router, controller } = app;
router.get('homepage', '/', controller.home.index);
};
// app/controller/home.js
class HomeController extends Controller {
async index() {
this.ctx.body = 'hi, egg';
}
}
对应的测试代码:
// test/controller/home.test.js
const { app, mock, assert } = require('egg-mock/bootstrap');
describe('test/controller/home.test.js', () => {
it('should work', () => {
// 对 app 发起 `GET /` 请求
return app.httpRequest()
.get('/')
.expect(200) // 期望返回 status 200
.expect(/hi/); // 期望 body 包含 hi
});
});
执行测试:
$ npm test
test/app/controller/home.test.js
✓ should work
1 passing (100ms)
就这么简单
@atian25 哈哈 done!请教一下像这样的返回的数据比较复杂的,如何测试才能更准确呢
describe('test/controller/home.test.js', () => {
it('should work', async () => {
const { status, res } = await app.httpRequest().get('/');
// 这里我忘记有没有 json 了,如果没有就自己 parse res.text
// 到了这步你就可以任意了,找一些 assert 的库,甚至用 JSON Scheme 判断都行
// 我个人是推荐直接用 assert,会自动替换为 power-assert , 看我们文档里面描述的 power-assert 的强大
assert(res.body.xx === 'xxx');
});
});
@atian25 明白,学习了,谢谢大佬的指点。补充一下
// 这里我忘记有没有 json 了,如果没有就自己 parse res.text (这里没有json)
@k-water 那要看下 supertest 的源码了,它们是有个 expect(json)
的方式的,可能是在 expect 里面 parser 了,而不是在 res 里面。
研究了下,其实已经是 parse 好的,这样就行了:
it('should GET /', async () => {
const result = await app.httpRequest().get('/');
assert(result.status === 200);
assert.deepEqual(result.body, { name: 'egg' });
});
@atian25 嗯嗯 确实可以 感谢
@x-cold 用我那方式更优雅一点,我喜欢跟 asset 一样
@x-cold ok
学习了