为什么单元测试覆盖范围不覆盖下一行?

时间:2020-09-24 06:34:05

标签: angular jasmine karma-jasmine

我运行jasmin-Karma测试以下功能

ExampleFunction(someParam) {
    let element = document.querySelector(`aSelectorId}`);
    if (element ) {
      element.classList.remove('disabled');
      element.classList.add('enabled');
    }
  }

这是我跑步的测试

 describe('ExampleFunction', () => {
    it('it should enable and disable', () => {
      spyOn(document, "querySelector").and.callFake(function() {
        return {
              value: true
          }
      });
      componentInstance.ExampleFunction("params");
      expect(componentInstance.Somevalue).toBe(something);
    });
  });

现在的问题是代码覆盖率显示

 element.classList.remove('disabled');

已覆盖但未覆盖此行!

  element.classList.add('enabled');

请大家告诉我为什么会发生吗?

1 个答案:

答案 0 :(得分:1)

您在间谍内部指定的返回值没有classList属性。这应该导致最后一行代码无法执行。

尝试在间谍中添加两个“删除并添加”方法:

return {
  value: true
  classList: {
    remove: () => {},
    add: () => {}
  }         
}

或者,您还可以提供用于remove和add的模拟,以便您也可以测试这些方法是否具有正确的属性。

这可能看起来像这样:

    it('it should enable and disable', () => {
      const removeSpy = jasmine.createSpy();
      const addSpy = jasmine.createSpy();

      spyOn(document, "querySelector").and.callFake(function() {
        return {
              value: true,
              classList: {
                 add: addSpy,
                 remove: removeSpy
              }
          }
      });
      componentInstance.ExampleFunction("params");
      expect(componentInstance.Somevalue).toBe(something);
      expect(addSpy).toHaveBeenCalledWith('enabled');
      expect(removeSpy).toHaveBeenCalledWith('disabled')
    });

请注意,这是伪代码,我没有对其进行正确的测试,但是它应该可以正常工作。

看看jasmine documentation