如何测试ExpressJS路由和'控制器'分别

时间:2014-08-12 00:15:46

标签: javascript node.js unit-testing asynchronous express

我的Express路由定义如下(其中app是我的Express应用程序):

module.exports = function(app) {
  var controller = require('../../app/controllers/experiment-schema');
  app.route('/api/experiment-schemas/random').get(controller.random);
};

在那个'controller'文件中,我有这个方法:

exports.random = function (req, res, callback) {

  ExperimentSchema.count({}, function (err, count) {

    var rand = Math.floor(Math.random() * count);

    ExperimentSchema.find({})
      .skip(rand)
      .limit(1)
      .populate('mediaPool', 'artist title label')
      .exec(function (err, schema) {

        res.json(200, schema);

        if (typeof callback === 'function') {
          callback();
        }
      });
  });
}

此处,ExperimentSchema是一个Mongoose模型。由于控制器方法命中数据库,我在测试中传入一个回调,以便我可以等待那些数据库调用返回并验证返回值。我这是基于this question

当我去测试路线时,我正在使用supertest进行测试,实际上是对路由进行HTTP调用。问题是,当我这样做时,Express会将next作为我的random方法的第三个参数注入。现在,callback()别名next(),一切都变得混乱。如何单独测试我的路线和控制器?

2 个答案:

答案 0 :(得分:0)

测试控制器函数的最佳方法是模拟请求和响应数据并将其导出到像mocha这样的测试套件。虽然看起来你也需要嘲笑你的mongoose架构。除非您想模拟这些函数的输入,否则没有简单的方法来测试这些组件。

答案 1 :(得分:0)

我通过重构路线来修复此问题,只期望默认参数reqres

相关问题