【问题标题】:Express JS Integration testing with Supertest and mock database使用 Supertest 和模拟数据库进行 Express JS 集成测试
【发布时间】:2013-10-26 13:41:18
【问题描述】:

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

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

【问题讨论】:

    标签: javascript node.js express mocha.js supertest


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 2013-06-07
      • 1970-01-01
      • 2019-09-06
      • 2017-01-23
      相关资源
      最近更新 更多