我的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()
,一切都变得混乱。如何单独测试我的路线和控制器?
答案 0 :(得分:0)
测试控制器函数的最佳方法是模拟请求和响应数据并将其导出到像mocha这样的测试套件。虽然看起来你也需要嘲笑你的mongoose架构。除非您想模拟这些函数的输入,否则没有简单的方法来测试这些组件。
答案 1 :(得分:0)
我通过重构路线来修复此问题,只期望默认参数req
和res
。