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

时间:2013-10-17 21:09:32

标签: javascript node.js express mocha 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);
      });
    }
  };

URI的索引是

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

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

app.get('/', exports.callbacks.index);

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

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

1 个答案:

答案 0 :(得分:9)

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

1)使用rewire将mongodb等数据库驱动程序库替换为模拟驱动程序库,可能使用sinon的spy / stub / mock功能

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

这些都没有让一切变得干净无痛,但我已经从中获得了一些实用性。