eggjs service 中使用了 egg-mysql 读取数据库,测试 service 时需不需要 mock?
Service 的主要任务就是对数据库进行 CRUD,测试时不知道怎么做才好:
- 连接真实数据库的话,需要每次填充数据和清空数据
- 使用 mock 的话,感觉没什么可测了,因为输入和输出都一样
比如 官方文档 Service 测试 直接把 POST 请求 mock 掉了,类比数据库就是把 insert mock 掉了:
it('should create success', async () => {
// 不影响 CNode 的正常运行,我们可以将对 CNode 的调用按照接口约定模拟掉
// app.mockHttpclient 方法可以便捷的对应用发起的 http 请求进行模拟
app.mockHttpclient(`${ctx.service.topics.root}/topics`, 'POST', {
data: {
success: true,
topic_id: '5433d5e4e737cbe96dcef312',
},
});
const id = await ctx.service.topics.create({
accesstoken: 'hello',
title: 'title',
content: 'content',
});
assert(id === '5433d5e4e737cbe96dcef312');
});
那 assert(id === '5433d5e4e737cbe96dcef312');
还有多大意义?
6 回复
单步插入读出貌似意义不大,长业务链的读写应该有用处吧。
开发过程中有些过程是在调试读写数据库,因为要确保列名、列的类型对应,满足长度限制、唯一性约束等。如果这都 mock 掉了,问题就不能在测试阶段发现了,所以我想应该用真实的数据库测。想更多的了解下大家的做法和原因。
连接真实数据库的话,需要每次填充数据和清空数据
docker or travis mysql service
@atian25 谢谢,能多解释下“docker or travis mysql service” 吗?公司没人指导,能提供更确切的搜索方向吗?
@xuxu7 就是你说的 连接真实数据库的话,需要每次填充数据和清空数据
不过这个数据库是 CI 提供的 service,或者你自己在 docker 里面启动一个,然后执行初始化数据库的脚本。
谢谢大神,我好好研究下