使用Supertest和模拟数据库进行Express JS集成测试

Jaz*_*uzz 8 javascript mocha.js node.js express supertest

是否可以使用supertest测试Express JS REST API,但用模拟数据库对象替换实际的数据库连接?我有单元测试,涵盖了数据库模型和应用程序的其他部分,以及API端点的功能测试,使得实际的数据库连接,但我有一个奇怪的要求,创建像功能测试但使用模拟数据库连接的集成测试.示例端点控制器如下:

  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);
      });
    }
  };
Run Code Online (Sandbox Code Playgroud)

而URI的索引是

var express = require('express'), app, exports;
app = exports = module.exports = express();

exports.callbacks = require('./controller');

app.get('/', exports.callbacks.index);
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*ons 9

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

1)使用重新连接来替换像mongodb这样的数据库驱动程序库和一个模拟的驱动程序库,也许使用sinon的spy/stub/mock功能

2)通过app.set('mongodb', connectedDb)dev/prod 将数据库设置为应用程序设置,但在测试环境中设置模拟数据库.这需要您的db访问代码(通常是模型)从应用程序获取数据库,或者是模拟友好的或使用依赖注入模式设计的.

这些都不能让一切都干净无痛,但我已经从中获得了一些实用性.