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 A 被 Controller 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 错误输出的主要内容,如果未能解决你的问题,请参考以下文章
怎么合并Jacoco的Code Coverage Report
询问 Angular 2 单元测试中的 Coverage 摘要?
ng test --code-coverage 不打印覆盖率详细信息