eggjs service 中使用了 egg-mysql 读取数据库,测试 service 时需不需要 mock?
发布于 5 年前 作者 xuxu7 4698 次浏览 来自 问答

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 里面启动一个,然后执行初始化数据库的脚本。

谢谢大神,我好好研究下

回到顶部