3

我正在使用 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 是异步调用的。
对该功能进行单元测试的正确方法是什么?

4

2 回答 2

2

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

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

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

于 2014-12-31T13:36:06.477 回答
0

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

return middleware(req, res).then(function () {
    expect(res.render).to.have.been.calledWith('whatever');
});
于 2015-12-14T12:04:58.707 回答