Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何测试ExpressJS路线和';控制器';分别地_Javascript_Node.js_Unit Testing_Asynchronous_Express - Fatal编程技术网

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();
        }
      });
  });
}