单元测试使用异步回调表达路由

时间:2014-12-31 12:21:40

标签: node.js express mocha sinon monk

我正在使用express在node.js中编写应用程序 我从快递中分离了路线定义,所以我可以在不嘲笑快车的情况下对其进行单元测试 我做的是:

file: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;

file: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是异步调用的,因此我无法找出正确的方法。
单元测试此功能的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

如果你正在使用mocha,它提供了你可以注入你的回调的“完成”功能,它会告诉mocha测试是异步的,应该等到调用该函数

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

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

答案 1 :(得分:0)

我正在寻找你的问题的答案,想知道你是否曾设法解决它。 我的工作是让路线(中间件)返回“承诺”#39;在功能中。 然后在我的单元测试中你可以做

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