Node.js Express路由/控制器中基于单元测试承诺的代码

ry

最近,在我的其余api Express应用程序中,我从使用回调切换为使用Promise。但是我在用诺言的异步行为对单元测试路由/控制器进行处理时遇到了麻烦。这是需要进行单元测试的示例代码。

var handler =  function (req, res, next) {
  var query = {}, 
  var options = {
    sort: { updatedAt: -1 },
    limit: 10
  };
  if (req.query.before) {
    query.updatedAt = { $lt: req.query.before };
  }
  // User.findAsync returns bluebird promise
  User.findAsync(query, null, options).then(function (user) {
    res.json(user);
  }).catch(function (e) {
    next(e);
  });
}
router.get('/api/users', handler);

我测试上述代码的方法是监视req,next和User.findAsync并检查是否使用正确的参数调用它们。但是由于承诺的异步行为,我很难检查是否调用了res.json或next。

我试图存根findAsync返回已解决的承诺(Promise.resolve(user))。但是仍然可以异步执行回调。

我不确定我是否在测试快速申请的正确道路上。

有什么好的策略可以很好地测试这种代码?

我也听说过使用超级测试。但是对我而言,使用超级测试从http端点进行测试感觉更像是集成测试,这不是单元测试,而且非常昂贵。

另外,总的来说,我想知道用单元测试覆盖所有代码(模型,控制器,中间件等)是否是一个好习惯,以及这样做的好策略或技巧是什么?或者如果足够好,可以使用超级测试来测试http端点。

本杰明·格伦鲍姆(Benjamin Gruenbaum)

如果您所测试的方法没有返回promise,那么您将无法在Mocha中使用promise语法。您可以使用与测试任何其他异步方法相同的方法来测试您的方法-使用done作为参数it假设我们要测试您的handler功能:

var handler =  function (req, res, next) {
  //...
  User.findAsync(query, null, options).then(function (user) {
    res.json(user);
  }).catch(function (e) {
    next(e);
  });
}

我们可以这样编写测试:

describe("The handler", function(){
     it("calls res.json", function(done){ // note the done argument
         handler({query: {before: 5}, // mock request
                 {json: done} // res.json calls our `done` param of this function
                 function(){ throw new Error("error called"); });
     });
});

请注意,我们模拟了请求,响应和next处理程序。我们的模拟响应有一个json方法,可以让测试知道它已经完成(如果您想在其中进行断言,这可以是一个函数),并且如果next被调用,我们抛出的信号不是应该发生的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Node.js Express路由/控制器中基于单元测试承诺的代码

来自分类Dev

使用Node.js,Gulp.js和Mocha单元测试angularjs控制器

来自分类Dev

使用Node.js,Gulp.js和Mocha单元测试angularjs控制器

来自分类Dev

带有承诺处理的单元测试 - node.js

来自分类Dev

如何在 Node JS 中使用 express 创建控制器和路由器

来自分类Dev

对使用Moment JS的控制器进行单元测试

来自分类Dev

对使用Moment JS的控制器进行单元测试

来自分类Dev

如何在Mocha中编写Sails.js控制器的单元测试

来自分类Dev

angular js控制器中的单元测试观察者

来自分类Dev

如何在Ember.js单元测试中为控制器设置模型数据

来自分类Dev

单元测试express.js路由

来自分类Dev

Node.js中的模型-视图-控制器模式

来自分类Dev

如何从node.js到angular.js控制器运行moment.js代码?

来自分类Dev

如何对Node Js Express应用程序进行单元测试

来自分类Dev

Node js中的条件承诺

来自分类Dev

模型和控制器之间的node.js / express js交互

来自分类Dev

Express Js / Node Js res.render在控制器抛出错误

来自分类Dev

如何使用Mocha单元测试node.js功能?

来自分类Dev

Node JS 单元测试用例 mysql

来自分类Dev

一个控制器中的多个请求URL映射处理程序在Node Express JS中不起作用

来自分类Dev

Node.js路由发送到错误的控制器

来自分类Dev

node.js中的导入功能运行单元测试中为只读

来自分类Dev

Node JS:Express入门

来自分类Dev

编写单元测试以搜索记录并在Node JS中对记录进行排序

来自分类Dev

如何使用Jest在Node.js中对uncaughtException和unhandledRejection进行单元测试

来自分类Dev

在Node.js中,您将如何编写单元测试页面速度?

来自分类Dev

我该如何对node.js中的文件流进行单元测试?

来自分类Dev

在 Node.js 中单元测试和模拟 mySQL 数据库

来自分类Dev

尝试在控制器上发送操作,导致Ember.js的单元测试失败

Related 相关文章

  1. 1

    Node.js Express路由/控制器中基于单元测试承诺的代码

  2. 2

    使用Node.js,Gulp.js和Mocha单元测试angularjs控制器

  3. 3

    使用Node.js,Gulp.js和Mocha单元测试angularjs控制器

  4. 4

    带有承诺处理的单元测试 - node.js

  5. 5

    如何在 Node JS 中使用 express 创建控制器和路由器

  6. 6

    对使用Moment JS的控制器进行单元测试

  7. 7

    对使用Moment JS的控制器进行单元测试

  8. 8

    如何在Mocha中编写Sails.js控制器的单元测试

  9. 9

    angular js控制器中的单元测试观察者

  10. 10

    如何在Ember.js单元测试中为控制器设置模型数据

  11. 11

    单元测试express.js路由

  12. 12

    Node.js中的模型-视图-控制器模式

  13. 13

    如何从node.js到angular.js控制器运行moment.js代码?

  14. 14

    如何对Node Js Express应用程序进行单元测试

  15. 15

    Node js中的条件承诺

  16. 16

    模型和控制器之间的node.js / express js交互

  17. 17

    Express Js / Node Js res.render在控制器抛出错误

  18. 18

    如何使用Mocha单元测试node.js功能?

  19. 19

    Node JS 单元测试用例 mysql

  20. 20

    一个控制器中的多个请求URL映射处理程序在Node Express JS中不起作用

  21. 21

    Node.js路由发送到错误的控制器

  22. 22

    node.js中的导入功能运行单元测试中为只读

  23. 23

    Node JS:Express入门

  24. 24

    编写单元测试以搜索记录并在Node JS中对记录进行排序

  25. 25

    如何使用Jest在Node.js中对uncaughtException和unhandledRejection进行单元测试

  26. 26

    在Node.js中,您将如何编写单元测试页面速度?

  27. 27

    我该如何对node.js中的文件流进行单元测试?

  28. 28

    在 Node.js 中单元测试和模拟 mySQL 数据库

  29. 29

    尝试在控制器上发送操作,导致Ember.js的单元测试失败

热门标签

归档