如何使用Bookshelf模型和Express服务器重构和测试api服务?

时间:2018-03-09 15:19:00

标签: unit-testing express bookshelf.js

我有以下服务返回Bookshelf模型数据。服务器建立在express上。我的核心问题是:我想为服务编写测试。其次,我不确定服务测试是否应包括与db的交互;如下所示,这些服务目前与快递交织在一起。

// services.js

import Region from "../../models/region";
import Subregion from "../../models/subregion";
import bookshelf from "../../bookshelf.config";

/** Regions **/
export const getRegions = (req, res, next) => {
  Region.forge()
    .fetchAll()
    .then(regions => {
      log.info("Got all regions");
      res.status(200).json(regions);
    })
    .catch(next);
};

/** Subegions **/
export const getSubregions = (req, res, next) => {
  Subregion.forge()
    .fetchAll({
      columns: ["id", "name"],
    })
    .then(subregions => {
      res.status(200).json(subregions);
    })
    .catch(next);
};

问题
1.什么是测试getRegions等函数的正确方法? 2.最佳做法是否需要从快速上下文中提取getRegionsgetSubregions

2 个答案:

答案 0 :(得分:1)

您必须分析您的功能的作用以及测试它的最佳方法。查看getRegions函数,它只获取特定类型的所有模型,并将结果作为JSON返回给用户。

考虑到这一点,你自己的逻辑很少,只是两个模块之间的一点点粘合,所以对单元测试该功能没有意义,因为你只是在测试是否使用过的模块(Bookshelf)和Express)工作正常,这应该超出了你的项目范围。

但是,您可能希望测试您的API是否通过各种用户输入正确响应,因此您应该使用SuperTest之类的内容进行一些集成测试。

至于使用实际数据库进行测试或嘲笑它,我认为这只是个人意见或项目目标的问题。

答案 1 :(得分:0)

  1. getRegions只是一个功能。您可以像正常功能一样对其进行测试。你需要嘲笑Express' resreqnext个对象。除了Express对象之外,您还需要模拟Bookshelf / knex,因为您不想依赖于实际的数据库。有关书架测试,请参阅this答案。

  2. 已经从Express'上下文,因为您将其定义为函数。如果您已将其定义为app.post('/example' (req, res, next) => {}),那么它将与Express结合使用。