2

我的堆栈是:Angular.js、Karma、Karma-coverage (Istanbul) 和 Jasmine。

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

我怀疑以下情况是罪魁祸首:

  • 我知道Service AController B使用。
  • 控制器 B被测试覆盖,并且代码覆盖结果正确地将其标记为被测试覆盖。
  • 测试Controller B时服务 A没有被模拟。

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

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

提前致谢!

4

1 回答 1

3

Unfortunately, this is how code coverage is evaluated. If the code is executed, it is considered to be "covered". Luckily, there is something you can do to reduce some of the false positives. You can mock out your dependencies!

The following example will execute a jasmine spy instead of the actual service:

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

Here is a working Plunker: http://plnkr.co/edit/x8gQQNsHT0R5n5iJSxKw?p=info

于 2014-11-19T03:28:25.580 回答