Javascript 角度码覆盖错误输出

Javascript 角度码覆盖错误输出,javascript,angularjs,jasmine,istanbul,karma-coverage,Javascript,Angularjs,Jasmine,Istanbul,Karma Coverage,我的堆栈是:Angular.js、Karma、Karma coverage(伊斯坦布尔)和Jasmine 我一直在对我的应用程序进行代码覆盖率分析,问题是 我得到的服务A被标记为测试覆盖(绿色),而实际上没有任何相关测试 我怀疑是以下情况造成的: 我知道控制器B使用服务A 控制器B已被测试覆盖,代码覆盖率结果将其正确标记为已被测试覆盖 测试控制器B时,服务A未被模拟 我认为,由于控制器B的测试间接调用了服务A,因此我得到了错误的结果 有什么想法吗?我猜对了吗?有什么办法可以让我在这方面得到准

我的堆栈是:Angular.js、Karma、Karma coverage(伊斯坦布尔)和Jasmine

我一直在对我的应用程序进行代码覆盖率分析,问题是 我得到的服务A被标记为测试覆盖(绿色),而实际上没有任何相关测试

我怀疑是以下情况造成的:

  • 我知道控制器B使用服务A
  • 控制器B已被测试覆盖,代码覆盖率结果将其正确标记为已被测试覆盖
  • 测试控制器B时,服务A未被模拟
我认为,由于控制器B的测试间接调用了服务A,因此我得到了错误的结果

有什么想法吗?我猜对了吗?有什么办法可以让我在这方面得到准确的测试覆盖率结果吗


提前谢谢

不幸的是,代码覆盖率就是这样计算的。如果代码被执行,则视为“已覆盖”。幸运的是,您可以做一些事情来减少一些误报。你可以模仿你的依赖关系

以下示例将执行jasmine spy而不是实际服务:

describe('Controller Tests', function() {
  var $scope, mockServiceA;

  beforeEach(module('app', function($provide) {
    mockServiceA = jasmine.createSpyObj('mockServiceA', ['foo']);
    $provide.value('ServiceA', mockServiceA);
  }));

  beforeEach(inject(function($rootScope, $controller) {
    $scope = $rootScope.$new();
    $controller('ControllerB', {
      $scope: $scope
    });
  }));

  describe('ControllerB', function() {
    it('should call mock service', function() {
      expect(mockServiceA.foo).not.toHaveBeenCalled();
      $scope.useServiceA();
      expect(mockServiceA.foo).toHaveBeenCalled();
    });
  });
});

这是一个有用的例子:

谢谢你的回答!嘲笑石头!但有时,模仿具有大量依赖关系的复杂组件太过突兀。在评估和分析代码覆盖率报告时,最好记住这一点。如上所述,模拟服务的另一种方法是spyOn().和.callFake()。我发现单元测试最终比他们正在测试的代码要多做一些工作,但这是我们为稳定性付出的代价。谢谢!对于那些感兴趣的人,这是Jasmine关于间谍的文档的链接