我有以下服务返回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.最佳做法是否需要从快速上下文中提取getRegions
和getSubregions
?
答案 0 :(得分:1)
您必须分析您的功能的作用以及测试它的最佳方法。查看getRegions
函数,它只获取特定类型的所有模型,并将结果作为JSON返回给用户。
考虑到这一点,你自己的逻辑很少,只是两个模块之间的一点点粘合,所以对单元测试该功能没有意义,因为你只是在测试是否使用过的模块(Bookshelf)和Express)工作正常,这应该超出了你的项目范围。
但是,您可能希望测试您的API是否通过各种用户输入正确响应,因此您应该使用SuperTest之类的内容进行一些集成测试。
至于使用实际数据库进行测试或嘲笑它,我认为这只是个人意见或项目目标的问题。
答案 1 :(得分:0)
getRegions
只是一个功能。您可以像正常功能一样对其进行测试。你需要嘲笑Express' res
,req
和next
个对象。除了Express对象之外,您还需要模拟Bookshelf / knex,因为您不想依赖于实际的数据库。有关书架测试,请参阅this答案。
已经从Express'上下文,因为您将其定义为函数。如果您已将其定义为app.post('/example' (req, res, next) => {})
,那么它将与Express结合使用。