【发布时间】:2017-11-15 17:40:58
【问题描述】:
我有一些代码如下所示:
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);
});
});
}
我正在尝试测试错误运行的块,但由于承诺而遇到困难。我使用 mocha 进行测试运行,使用 sinon 进行存根。我可以存根请求,以便我可以计算调用 on 方法的次数,但包含的 Promise 永远不会解决。
有一些包可以与 sinon 一起处理 Promise(我尝试过 sinon-as-promised 和 sinon-stub-promise),但我必须对整个 doThing 方法进行存根处理才能正确解析。对于测试此代码或可能更容易测试的替代代码结构的正确方法,我将不胜感激。
有问题的测试(挂起等待 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方法。在大多数情况下更有意义:-) -
我的回答对您有帮助吗?没有回复、点赞或指定答案...
-
它帮助我拓宽了我的整体知识,但实际上是一位同事解决了我遇到的问题。在我自己写答案之前,我正在给他一个回应的机会。
-
他修复了你的
post回调,我猜?但是您知道,如果您发现几个答案有用,您可以投票赞成 - 即使您将答案授予其他人;-)
标签: javascript node.js promise sinon