如何在if条件下在for-in循环中增加分支的覆盖范围?

时间:2019-06-27 11:49:29

标签: javascript typescript unit-testing jestjs tslint

我遵循以下代码,该代码将一个对象的几个字段映射到另一个对象并复制值:

//Function params
var source= {"f1": "v1", "f2": "v2", "f3":"v3"};
var fieldsMapping = {"f1": "c1", "f2":"c2"};

//function definition starts
var copiedObj = {};    
for (var name in source) {
  if (source.hasOwnProperty(name)) { //Line X
    if(fieldsMapping[name]){
        copiedObj[fieldsMapping[name]] = source[name];
    }
  }
}

console.log(copiedObj); //outputs {c1: "v1", c2: "v2"}

我已经在jest中为此功能编写了测试用例,具有100%的行覆盖率,但是分支覆盖率显示Line X未被覆盖。按照Standards中类似的TSLintfor-in循环后应跟if condition

有人可以建议如何为此增加一个测试用例branch coverage吗?

2 个答案:

答案 0 :(得分:1)

所以您看到这意味着此std::string已针对所有测试用例执行。因此,线路覆盖率显示为100%。但是要使分支覆盖率达到100%,您需要确保if在某些特定的测试用例中没有运行。

if对于从原型继承的属性返回hasOwnProperty。因此,我们将使用它来使该行不被执行:

false

PS尽量不要沉迷于100%覆盖率目标。

答案 1 :(得分:1)

额外的if用于确保代码的健壮性。这种健壮性检查无法通过明智的方式进行测试。这也会在代码的其他各个部分中发生-经常在switch语句中发生,其中明确涵盖了所有可能的情况,并添加了额外的默认情况以引发异常或以其他方式处理这种“不可能的”情况。或者,考虑添加到代码中的断言语句:由于断言永远都不会失败,因此严格来说,您将永远无法覆盖断言语句中隐藏的else分支-如何测试断言中的表达式对真正检测到您想要的问题?

删除此类健壮性代码和断言不是一个好主意,因为它们还可以帮助您检测到未来更改的不良副作用。最后,您将不得不做出明智的决定(通过详细查看覆盖率报告,而不仅仅是整体百分比),真正需要覆盖代码的哪些语句/分支等,而哪些则不需要。

最后,请注意,较高的代码覆盖率并不一定表示您的测试套件具有高质量。如果测试套件可以检测到代码中可能存在的错误,则它的质量很高。您可以拥有一个覆盖率100%的测试套件,它不会检测任何潜在的错误。