9

是否可以使用 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 检索数据

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

4

1 回答 1

10

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

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

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

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

于 2014-04-04T00:48:13.717 回答