函数相等断言被代码覆盖率报告破坏

时间:2015-05-26 23:40:56

标签: javascript code-coverage karma-runner istanbul

我正在研究测试框架。断言两个函数相等,我使用:

var a = function(){ return 5; };
var b = function(){ return 5; };

var areEqual = (a.toString() == b.toString());

我用业力进行了一些测试,一切都很好,直到我添加了一份带有业力报道报告的测试报告。上面的断言是失败的,因为伊斯坦布尔似乎在添加代码两个函数。

a.toString()

看起来像:

function () {
  __cov_Mgz6NtZP5n6U6J27W7D4rA.f['33']++;
  __cov_Mgz6NtZP5n6U6J27W7D4rA.s['152']++;
  return 5;
}

我尝试过:

/* istanbul ignore next */
var a = function(){ return 5; };
/* istanbul ignore next */
var b = function(){ return 5; };

但它似乎不起作用。你知道我怎么解决这个问题。

2 个答案:

答案 0 :(得分:2)

目前为止,最好的选择是在另一个业力配置中分离您的承保范围。你可以同时运行两个,比如

grunt karma:units

grunt karma:coverage

在单位上代码不会被混淆

答案 1 :(得分:1)

您可以使用正则表达式删除伊斯坦布尔注射。

var aStr = a.toString();
// function () {__cov_Mgz6NtZP5n6U6J27W7D4rA.f['33']++;__cov_Mgz6NtZP5n6U6J27W7D4rA.s['152']++;return 5;}

var aCleanStr = aStr.replace(/__cov.*?;/g, '');
// function () {return 5;}

表达式为/__cov.*?;/g,其中

  • __cov - 将匹配以__cov
  • 开头的子字符串
  • .*?; - 会匹配任何字符,直到第一个;,因为在伊斯坦布尔注入之间可能会有一些代码,?这里代表'非贪婪'选项
  • flag g - 从字符串
  • 中删除所有这些条目