我已经在AngularJS中使用Karma测试运行器和Jasmine测试框架设置了我的单元测试。我的代码覆盖率报告很好地向我展示了我的测试中涵盖了哪些行和条件。通过此覆盖率报告,我意识到我的代码(见下文)中的if
条件未被测试。我是否需要为angular.forEach()
电话创建模拟?如果是这样,怎么做到这一点?使用ngMock?
为了使我的问题更加明确,我想在if
调用中使用angular.forEach()
条件为您提供示例。
比如说我有以下服务:
angular.module('myApp').service('myService', function () {
function myFunction(myFunctionParameters) {
// ... Some irrelevant code...
var x = [];
angular.forEach(xObjs, function(o) {
if (some condition) { // <--- Code coverage says this is not tested!!
// do something...
}
});
// ... Some more irrelevant code
return // Something //
}
return {
myFunction: myFunction
};
});
对“myService”的测试可能是这样的:
describe("myService", function() {
// Some variables
// Declare the mocking variable
// Invoke the module
beforeEach(module('myApp'));
beforeEach(function(){
// Define the mock variable
mockVariable = <define mock variable here>
module(function($provide) {
$provide.value('serviceToMockName', mockVariable);
});
// Inject the services
inject(function(_myService_) {
myService = _myService_;
});
// Spy on the mock
// Call myFunction function in myService
result = myService.myFunction(functionParameters);
});
// Write some tests for the myFunction call in myService
describe("myFunction", function() {
it("should test the if condition...", function() {
// How to make sure I did the condition check in the if statement!!
});
});
});
CODE COVERAGE
以绿色突出显示的是第21,22和24行。以红色突出显示的唯一行是23,即if
条件。所以报道说我正在输入if
(因为第24行以绿色突出显示)但是if
条件本身没有被覆盖?
21 11 var x = [];
22 11 angular.forEach(xObjs, function(o) {
23 55 if (o.values.length) {
24 55 x.push(o.values[o.values.length-1]);
25 }
26 });
答案 0 :(得分:0)
不可能这样直截了当。但您可以在if条件之后和之后在服务中设置变量。 就像那样,你将能够在测试中恢复,以检查它是否被调用。
expect(yourService.getVariable()).toEqual(theValueThatYouExpect);
要继续前进,您可以想象在函数中增加一个变量来检查if被调用的时间。