javascript-如何测试控制器中是否正在调用方法?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript-如何测试控制器中是否正在调用方法?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1722字,纯文字阅读大概需要3分钟。
内容图文
![javascript-如何测试控制器中是否正在调用方法?](/upload/InfoBanner/zyjiaocheng/680/8292f5d227614f5ab1c4f9b483e8a4fd.jpg)
这是有关使用Mocha在Sails JS中进行异步测试的问题.
我正在使用supertest库在Sails JS中编写控制器测试.我想检查是否在HTTP POST上调用了一个方法到我们的控制器.为此,我对方法进行了测试,并期望在end()中调用它,如下所示:
request(sails.hooks.http.app)
.post('heartbeat/create')
.send('device: 1')
.end(function(err, res) {
expect(publishCreateStub.called).to.be.true;
done();
});
当我运行它时,期望会失败,因为断言时不会调用该方法.但是,当我将期望值放入setTimeout中时,它可以正常工作:
request(sails.hooks.http.app)
.post('heartbeat/create')
.send('device: 1')
.end(function(err, res) {
setTimeOut(function() {
expect(publishCreateStub.called).to.be.true;
done();
}, 1000);
});
没有setTimeout,有什么方法可以使测试通过吗?
这是我正在测试的代码部分:HeartbeatController#create
您还可以通过发送拉取请求来帮助我们解决问题:https://github.com/multunus/one-mdm/issues/1
解决方法:
实际的问题是您的控制器不等待publishCreate被调用.因此,您以201 Created进行响应,而不检查是否已创建任何东西.
Heartbeat.findOne或Heartbeat.publishCreate都有可能失败,但您会更新.
要解决此问题,您应该修改控制器,在Heartbeat Promise回调内移动响应部分:
create: function (req, res, next) {
if(req.isSocket) {
Heartbeat.watch(req);
}
Heartbeat.create(req.body)
.exec(function(error, heartbeat) {
if(error) {
res.status(422);
return res.send('Invalid heartbeat data');
}
Heartbeat.findOne(heartbeat.id).populate('device').then(function(newHeartbeat) {
Heartbeat.publishCreate(newHeartbeat.device);
}).then(function() {
// success
res.status(201);
res.json({
device: heartbeat.device
});
}, function(err) {
// something bad happened
next(err);
});
});
}
在我的示例中,我将实际的错误处理委托给下一个快速的错误处理中间件:
next(err);
但是您可以决定自己处理错误,例如:
res.status(400);
res.send('Can not publish Heartbeat create');
内容总结
以上是互联网集市为您收集整理的javascript-如何测试控制器中是否正在调用方法?全部内容,希望文章能够帮你解决javascript-如何测试控制器中是否正在调用方法?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。