使用Q promise的node.js项目的代码覆盖率

时间:2014-05-19 08:31:39

标签: node.js gruntjs code-coverage promise q

我目前正在开发node.js项目。我们将Q库用于承诺(https://github.com/kriskowal/q)。

我们正在使用mocha进行测试,并使用grunt任务(https://github.com/pghalliday/grunt-mocha-test)提供代码覆盖,其中使用blanket.js进行覆盖,使用travis-cov报告器来声明覆盖阈值。

不幸的是,该解决方案不为承诺提供分支机构覆盖。

我尝试过Intern(http://theintern.io/),但是我写的基本示例也没有显示正确的分支覆盖率。

您能否推荐一种能够为Q promises提供正确覆盖的解决方案,并与grunt和节点无缝协作?

1 个答案:

答案 0 :(得分:0)

好吧,检查承诺的覆盖范围应该不会太难,因为JavaScript具有绝对生病的面向方面的编程能力。虽然自动化工具在这里是offtopic,但让我们来看看承诺的分支:

  • 首先,promise的解析器函数(promise构造函数或者deferred)都有自己的分支。
  • 每个.then子句有3个分支(一个用于成功,一个用于失败,一个用于进度),如果你也想要循环覆盖,你需要每个进度事件,当进度附加到火零时,一次和多次 - 虽然让我们避免这个问题的进展,一般来说,因为它在Q中被弃用和替换。
  • .done.catch等...都是.then的私密案例。像.all这样的聚合方法是promise构造函数的私有情况,因为它们创建了新的聚合承诺,并且还需要检查它们的.then

所以,让我们看看我们如何做到这一点,首先 - 请注意Q在内部使用Promise.prototype.then进行聚合方法,因此我们可以覆盖它:

Promise.prototype._then = Promise.prototype.then;
var branches = 0;
Promise.prototype.then = function(fulfilled,rejected,progressed){
    branches += (fulfilled.call) +(rejected.call) + (progressed.call);
    var nFulfilled = function(){ branches--;return fulfilled.apply(this,arguments); };
    var nRejected = function(){ branches--; return rejected.apply(this,arguments); };
    //progression may happen more than once
    var nProgressed = function(){ 
        if(!nProgress.happened) {
            branches--;
            nProgress.happened = true;
        }
        return progressed.apply(this,arguments); 
    };
    nProgressed.happened = false;
    return this._then((fulfilled.call) ? nFulfilled : undefined,
                      (rejected.call) ? nRejected : undefined,
                      (progressed.call) ? nProgressed : undefined);
};

我们在这里做的是挂钩每个.then并跟踪附加的处理程序和处理程序。

branches变量将包含使用promises创建的代码路径数,而不是实际执行的代码路径数。你可以在这里使用更复杂的逻辑(例如 - 计数而不是减去),我希望看到有人拿起手套并从中制作一个git repo:)