gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:08:17 24 4
gpt4 key购买 nike

我目前正在从事 node.js 项目。我们使用 Q 库来实现 promise (https://github.com/kriskowal/q)。

我们使用 mocha 进行测试,并使用 grunt 任务 ( https://github.com/pghalliday/grunt-mocha-test ) 提供的代码覆盖,它使用 blanket.js 进行覆盖,使用 travis-cov reporter 断言覆盖阈值。

不幸的是,该解决方案没有为 promise 提供分支覆盖。

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

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

最佳答案

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

  • 首先,promise 的解析器函数(promise 构造函数或 deferred)有自己的分支。
  • 每个 .then 子句有 3 个分支(一个用于成功,一个用于失败,一个用于进度),如果你也想要循环覆盖,你需要每个进度事件附加到触发零次,一次和多次——尽管让我们避免在这个问题上取得进展,并且一般来说,因为它在 Q 中被弃用和替换。
  • .done.catch 等都是.then 的私有(private)情况。像 .all 这样的聚合方法是 promise 构造函数的私有(private)案例,因为它们创建了一个新的聚合 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);
};

我们在这里做的是 Hook 每个 .then 并跟踪附加的处理程序和被调用的处理程序。

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

关于node.js - 使用 Q promises 的 node.js 项目的代码覆盖率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23733108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com