开玩笑的报道说我的条件没有被覆盖,但它正在使用该代码

Jest coverage says my conditional isn't being covered, but it's using that code

我正在使用节点并开玩笑地进行测试。

我有这样的功能:

12 function replace(obj, key, data) {
13   if (!data) {
14     return;
15   }
16
17   if (!obj[key]) {
18     obj[key] = {}; 
19   }
20
21   obj[key] = deepmerge(obj[key], data);
22 }

这是我正在做的测试:

test('my test', () => {
  let obj = { a: 1 };

  expect(obj.b).not.toBeDefined();
  replace(obj, 'b', {foo:"bar"});
  expect(obj.b.foo).toBe("bar");
});

考试当然通过了。但无论我做什么,我的测试覆盖率都显示第 17 行未被覆盖。我可以离开它,但出于好奇,我想弄清楚 为什么 它不被视为涵盖(and/or 我该如何修复它)。有什么见解吗?

事实证明这是一个相当微妙的问题。

第 17 行测试如果密钥不存在于 obj 中会发生什么。结果是 all 我的测试都达到了那条线,这意味着 implicit else (当 key does exist in obj) 从未得到测试。

Jest 警告说 if(...)other 分支没有被测试(隐含的 else)。但是,当然,因为它是隐式的,所以它不能指向行号。它必须指向创建隐式 else 的行。

修复只是为了测试 if 条件及其替代条件 else