Node.js 如何忽略伊斯坦布尔承诺的所有失败案例

Node.js 如何忽略伊斯坦布尔承诺的所有失败案例,node.js,promise,q,istanbul,Node.js,Promise,Q,Istanbul,我使用NodeJS中的承诺以及伊斯坦布尔的代码覆盖率。是否有一种方法可以忽略所有失败案例。我的大部分都是为了防止意外情况发生,我无法在测试中复制 例如: somePromise .then(function() { console.log('yay!'); }, function(err) { /* istanbul ignore next */ console.error(err); }); 要在我的代码中的每个失败条件中添加该注释似乎有点费劲…简短的回答是,您不能轻易地通过编

我使用NodeJS中的承诺以及伊斯坦布尔的代码覆盖率。是否有一种方法可以忽略所有失败案例。我的大部分都是为了防止意外情况发生,我无法在测试中复制

例如:

somePromise
.then(function() {
  console.log('yay!');
}, function(err) {
  /* istanbul ignore next */ 
  console.error(err);
});

要在我的代码中的每个失败条件中添加该注释似乎有点费劲…

简短的回答是,您不能轻易地通过编程忽略所有“catchall”承诺失败

这里正确的做法是在测试中使用Q,并在承诺流中使用类似于强制拒绝承诺的模拟库,如下所示:

var Q           = require('q');
var sinon       = require("sinon");
var controller  = new Controller(); //Dummy constructor

//controller.method will automatically return a promise with a rejected state
sinon.stub(controller,"method").returns(Q.reject());

这样,伊斯坦布尔输入代码的这些部分,您将获得更高的代码覆盖率,这很好

所以我什么都做了。为了帮助清除错误捕获,我创建了一个传递到promise failure捕获中的函数,以便伊斯坦布尔将其视为变量,而不是未输入的函数。然后,我可以单独对错误处理进行单元测试

var errCatch = function(err) { /* something */ };

somePromise
.then(function() {
  console.log('yay!');
}, errCatch);

啊,是的,理论上讲这是有道理的!。不过,我正在通过运行的express服务器使用这些特定方法进行集成测试,sinon似乎不允许我更改其中的功能。想法?如果这些函数没有公开,并且你已经用所有可能的输入测试了它,这意味着你的catchall即使在生产中也不会触发。我在这里要做的是直接为控制器编写功能测试,完全绕过HTTP层,这可能是错误处理的地方。是的,这很有意义。最好把它拆开测试一下,然后忽略它。谢谢״我的大多数方法都是捕获所有方法,以防发生我无法在测试中复制的意外情况。״你的问题就在这里……就像捕获其他我无法控制输出的方法的所有方法一样,例如mongoose。