unit testingasynchronouscallback的快速路由
我正在使用express在node.js中编写一个应用程序。
我从快递中分离出路线定义,所以我可以在不嘲笑快递的情况下进行unit testing。
我做的是:
文件: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);
现在,我想编写一个unit testing,检查req.send是否被正确的参数调用。 我很难找出正确的方法,因为req.send是asynchronous调用的。
什么是unit testing这个function的正确方法?
如果你正在使用摩卡,它提供了你可以注入callback的“完成”函数,它会告诉摩卡,testing是asynchronous的,应该等到该函数被调用
it('should do something',function(done){ reuest.send(function(){ expect(true).toEqual(true); done() }) })
或类似的东西,我不记得这是100%正确的语法,但是非常接近,这是很好的callback,但如果你使用诺言另一方面,你应该检查柴和摩卡的承诺断言,是非常酷
我正在寻找你的问题的答案,想知道你是否设法解决它。 我的工作是让路由(中间件)在函数中返回“承诺”。 然后在我的unit testing中,你可以做
return middleware(req, res).then(function () { expect(res.render).to.have.been.calledWith('whatever'); });