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

How to increase branch coverage in jest in for-in loop with if condition?

我有以下代码,它将几个字段从一个对象映射到另一个对象并复制值:

//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 similar in TSLintfor-in 循环后应紧跟 if condition

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

所以你看到这意味着这个 if 对你所有的测试用例都执行了。这就是线路覆盖显示 100% 的原因。但是要获得 100% 的分支覆盖率,对于某些特定的测试用例,您需要使 if 不是 运行。

hasOwnProperty returns false 用于从原型继承的属性。所以我们将使用它来使该行不被执行:

const base = { a: 1};
const source = Object.create(base, {b: 2, c: 3} );
const fieldsMapping = {a: 'aa', b: 'bb', c: 'cc'};

expect(yourFunction(source, fieldsMapping)).toEqual({ bb: 2, cc: 3 }); 

PS 尽量不要沉迷于 100%-coverage-goal。

额外的 if 是为了代码的健壮性。这种稳健性检查无法以合理的方式进行测试。这也会发生在代码的其他各个部分 - 它经常发生在 switch 语句中,其中明确涵盖了所有可能的情况,并且添加了额外的默认情况只是为了抛出异常或以其他方式处理此 'impossible' 情况。或者,考虑添加到代码中的断言语句:由于断言永远不会失败,严格来说,您将永远无法覆盖隐藏在断言语句内的 else 分支——您如何测试断言内的表达式是否适合实际检测到你想要的问题?

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

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