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