Express JS与Supertest和模拟数据库的集成testing

是否可以使用supertesttestingExpress JS REST API,但用模拟数据库对象replace实际的数据库连接? 我有unit testing覆盖数据库模型和应用程序的其他部分,以及API端点的functiontesting,使得实际的数据库连接,但我有一个奇怪的要求,创build像functiontesting,但使用模拟数据库连接的集成testing。 示例端点控制器如下所示:

var model = require('../../../lib/models/list'); module.exports = { index: function(req, res) { var data = { key: 'domains', table: 'demo.events'}; var dataModel = new model(data); dataModel.query().then(function(results) { res.respond({data: results}, 200); }).fail(function(err) { console.log(err); res.respond({message: 'there was an error retrieving data'}, 500); }); } }; 

而URI的索引是

 var express = require('express'), app, exports; app = exports = module.exports = express(); exports.callbacks = require('./controller'); app.get('/', exports.callbacks.index); 

控制器中使用的列表模型连接到数据库并检索输出的数据。 面临的挑战是嘲笑实际的数据库调用,同时仍然使用supertest发出请求并从URI中检索数据

任何信息都会有帮助,包括如果你认为这是一个坏的或毫无意义的想法

我用两种方法取得了有限的成功:

1)使用rewire来replace数据库驱动程序库,如mongodb,也许使用sinon的间谍/存根/模拟function

2)设置您的数据库作为应用程序设置通过app.set('mongodb', connectedDb)为dev / prod,但在testing环境中设置一个模拟数据库。 这需要您的数据库访问代码(通常是模型)从应用程序获取数据库,否则是模拟友好或devisedependency injection模式。

这些都不能使一切都变得干净而无痛,但是我已经从中获得了一些实用性。