Angular Code Coverage错误输出

时间:2014-11-18 23:29:46

标签: javascript angularjs jasmine istanbul karma-coverage

我的筹码是:Angular.js,Karma,Karma-coverage(伊斯坦布尔)和Jasmine。

我一直在对我的应用程序运行代码覆盖率分析,问题,因此问题是 当实际没有任何关联的测试时,我会将服务A 标记为测试(绿色)标记。

我怀疑以下情况应该归咎于:

  • 我知道控制器B 使用服务A
  • 控制器B 受测试覆盖,代码覆盖率结果将其正确标记为测试所涵盖。
  • 测试控制器B 时,
  • 服务A 未被模拟。

我认为,由于服务A 是由控制器B 的测试间接调用的,所以我得到了错误的结果。

有什么想法吗?我怀疑是对的吗?有什么方法可以解决这个问题吗?我可以在这方面获得准确的测试覆盖率结果吗?

提前致谢!

1 个答案:

答案 0 :(得分:3)

不幸的是,这是评估代码覆盖率的方式。如果代码被执行,则认为是"覆盖"。幸运的是,你可以采取一些措施来减少一些误报。你可以嘲笑你的依赖项!

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

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();
    });
  });
});

这是一个有效的Plunker:http://plnkr.co/edit/x8gQQNsHT0R5n5iJSxKw?p=info