Javascript 如何测试ExpressJS路线和';控制器';分别地
我有一条定义如下的快速路线(其中Javascript 如何测试ExpressJS路线和';控制器';分别地,javascript,node.js,unit-testing,asynchronous,express,Javascript,Node.js,Unit Testing,Asynchronous,Express,我有一条定义如下的快速路线(其中app是我的快速app): 在该“控制器”文件中,我有以下方法: exports.random = function (req, res, callback) { ExperimentSchema.count({}, function (err, count) { var rand = Math.floor(Math.random() * count); ExperimentSchema.find({}) .skip(rand
app
是我的快速app):
在该“控制器”文件中,我有以下方法:
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
是一个猫鼬模型。由于controller方法命中数据库,所以我在测试中传入了一个回调,这样我就可以等待那些数据库调用返回并验证返回值。我这样做是基于
当我去测试路由时,我正在使用
supertest
进行测试,实际上是对路由进行HTTP调用。问题是,当我这样做时,Express正在注入next
作为我的random
方法的第三个参数。现在,callback()
别名next()
,一切都乱了套。如何分别测试我的路由和控制器?测试控制器功能的最佳方法就是模拟请求和响应数据,并将其导出到测试套件(如mocha)中。尽管看起来你也需要模仿猫鼬的模式。除非您想要模拟这些函数的输入,否则没有简单的方法来测试这些组件。我通过重构路由来修复这一问题,使其仅期望默认参数req
和res
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();
}
});
});
}