Angular Code Coverage 错误输出

Posted

技术标签:

【中文标题】Angular Code Coverage 错误输出【英文标题】:Angular Code Coverage wrong output 【发布时间】:2015-01-16 08:12:06 【问题描述】:

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

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

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

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

我认为由于 Controller B 的测试间接调用了 service A,所以我得到了错误的结果。

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

提前致谢!

【问题讨论】:

【参考方案1】:

不幸的是,这是评估代码覆盖率的方式。如果代码被执行,它被认为是“覆盖”。幸运的是,您可以采取一些措施来减少一些误报。你可以模拟出你的依赖!

以下示例将执行 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();
    );
  );
);

这是一个正常工作的 Plunker:http://plnkr.co/edit/x8gQQNsHT0R5n5iJSxKw?p=info

【讨论】:

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

以上是关于Angular Code Coverage 错误输出的主要内容,如果未能解决你的问题,请参考以下文章

VCS学习-Code Coverage

怎么合并Jacoco的Code Coverage Report

询问 Angular 2 单元测试中的 Coverage 摘要?

ng test --code-coverage 不打印覆盖率详细信息

Composer 无法更新或安装 PHPUnit/php-code-coverage

使用 karma-coverage 和 angularjs 对每个源文件进行代码覆盖