【问题标题】:How to refactor and test api service with Bookshelf models and Express server?如何使用 Bookshelf 模型和 Express 服务器重构和测试 api 服务?
【发布时间】:2018-03-09 15:18:59
【问题描述】:

我有以下返回 Bookshelf 模型数据的服务。服务器建立在快递上。我的核心问题是:我想为服务编写测试。其次,我不确定服务测试是否应该包括与数据库的交互;正如您在下面看到的,这些服务目前与 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

【问题讨论】:

    标签: unit-testing express bookshelf.js


    【解决方案1】:

    您必须分析您的函数的作用以及测试它的最佳方法是什么。查看getRegions 函数,它只是获取某种类型的所有模型并将结果以 JSON 格式返回给用户。

    鉴于此,您几乎没有自己的逻辑,它只是两个模块之间的一点点胶水,因此单元测试该功能没有意义,因为您只是测试使用的模块(书架和 Express) 工作正常,这应该超出了您的项目范围。

    但是,您可能确实想测试您的 API 是否正确响应各种用户输入,因此您应该使用 SuperTest 之类的东西进行一些集成测试。

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

    【讨论】:

    • 感谢您提供更高级别的清晰度。有道理。
    【解决方案2】:
    1. getRegions 只是一个函数。你会像正常功能一样测试它。您需要模拟 Express 的 resreqnext 对象。除了 Express 对象之外,您还需要模拟 Bookshelf/knex,因为您不想依赖实际的数据库。有关书架测试,请参阅this 答案。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      相关资源
      最近更新 更多