【问题标题】:unit testing express route with async callback使用异步回调对快速路由进行单元测试
【发布时间】:2014-12-31 12:21:39
【问题描述】:

我正在使用 express 在 node.js 中编写一个应用程序。
我将路由定义与 express 分开,这样我就可以在不模拟 express 的情况下对其进行单元测试。
我所做的是:

文件:usersRoutes.js

 var routes = {
  getAll: function(req,res) {
    var db = req.db; // req.db is initialized through a dedicated middleware function
    var usersCollection = db.get('users');
    usersCollection.find({},{limit:10},function(e,results){
      res.send(results);
    });
  }
};

module.exports = routes;

文件:users.js

var express = require('express');
var router = express.Router();
var routes = require('./usersRoutes');

/* GET users listing. */
router.get('/', routes.getAll);

module.exports = router;

最后在 app.js 中:

var users = require('./routes/users/users.js');
app.use('/users', users);

现在,我想编写一个单元测试来检查是否使用正确的参数调用了 req.send。 我无法找出正确的方法,因为 req.send 是异步调用的。
对这个函数进行单元测试的正确方法是什么?

【问题讨论】:

    标签: node.js express mocha.js sinon monk


    【解决方案1】:

    如果您使用 mocha,它会提供“完成”函数,您可以将其注入回调中,它会告诉 mocha 测试是异步的,应该等到该函数被调用

    it('should do something',function(done){
      reuest.send(function(){
         expect(true).toEqual(true);
         done()
      })
    })
    

    或者类似的东西,我不记得这是 100% 正确的语法,但非常接近 这对回调有好处,但如果你使用的是 Promise,你应该检查 chai 和 mocha 的 Promise 断言,非常酷

    【讨论】:

      【解决方案2】:

      我一直在寻找您问题的答案,想知道您是否曾经设法解决它。 我的解决方法是让路由(中间件)在函数中返回“承诺”。 然后在我的单元测试中你可以做

      return middleware(req, res).then(function () {
          expect(res.render).to.have.been.calledWith('whatever');
      });
      

      【讨论】:

        猜你喜欢
        • 2016-05-16
        • 1970-01-01
        • 1970-01-01
        • 2014-03-28
        • 2015-04-01
        • 2018-11-18
        • 2017-02-13
        • 1970-01-01
        • 2016-03-19
        相关资源
        最近更新 更多