我目前正在开发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和节点无缝协作?
答案 0 :(得分:0)
好吧,检查承诺的覆盖范围应该不会太难,因为JavaScript具有绝对生病的面向方面的编程能力。虽然自动化工具在这里是offtopic,但让我们来看看承诺的分支:
.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:)