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

How to refactor and test api service with Bookshelf models and Express server?

我有以下服务 return 书架模型数据。服务器建立在 express 之上。我的核心问题是:我想为服务编写测试。其次,我不确定服务测试是否应该包括与数据库的交互;正如您在下面看到的,这些服务目前与快递交织在一起。

// 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. 最佳实践是否需要从 express 上下文中提取 getRegionsgetSubregions

  1. getRegions 只是一个函数。你会像普通函数一样测试它。您需要模拟 Express 的 resreqnext 对象。除了 Express 对象之外,您还需要模拟 Bookshelf/knex,因为您不想依赖实际的数据库。请参阅 书架测试答案。

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

你必须分析你的函数做了什么以及测试它的最佳方法是什么。查看 getRegions 函数,它只是获取某种类型的所有模型,并且 returns 结果作为 JSON 提供给用户。

鉴于此,您自己的逻辑非常少,它只是两个模块之间的一点胶水,因此对该功能进行单元测试没有意义,因为您只是测试所使用的模块(Bookshelf 和 Express)运行正常,应该超出你的项目范围。

但是,您可能确实想测试您的 API 是否对各种用户输入做出正确响应,因此您应该使用 SuperTest.

之类的东西进行一些集成测试

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