我有一些代码,如下所示:测试失败的请求在节点
var request = require('request');
function Service(){
this._config = require('../path/to/config.json');
}
Service.prototype.doThing = function(){
return new Promise(function(resolve, reject){
request.post(url, {payload}, function(error, response, body){
//handle response
resolve(true);
}).on('error', function(err){
//handle errors
resolve(false);
});
});
}
我试图测试上的错误运行块,但由于其承诺的难度。我正在使用摩卡进行测试运行,并用sinon进行测试。我可以存根请求,以便可以统计on方法的调用次数,但包含的Promise永远不会解析。
有一些软件包可以和sinon一起处理promise(我试过sinon-as-promised和sinon-stub-promise),但是我必须存根整个doThing方法才能正确解析。我会感激任何输入的propper方式来测试这个代码或可能更容易测试的替代代码结构。
测试中的问题(即挂起等待doThing承诺返回)低于:
context('when the server is unavailable', function(){
beforeEach(function() {
var onStub = sinon.stub();
requestStub = {post: function(){ return {on: onStub}}};
Service = proxyquire('path/to/service', {request: requestStub});
service = new Service();
});
it('should not set the auth key', function(){
return service.doThing().then(function(x){
return assert(onStub.calledOnce);
});
});
});
谢谢!
只是对模块代码的评论。不要将状态值传递回你的'resolve'函数,而是在出现错误时执行'reject'方法。在大多数情况下更有意义:-) – oligofren
我的回答对你有帮助吗?没有回复,upvote或指定的答案... – oligofren
它帮助我扩大了我的整体知识,但它确实是一位同事,解决了我遇到的问题。在我自己写答案之前,我给了他一个回应的机会。 – biagidp