最近,在我的其余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端点。
如果您所测试的方法没有返回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] 删除。
我来说两句