【发布时间】:2016-04-20 09:44:03
【问题描述】:
我对 Karma 和 Jasmine 很陌生,我用它来为我的 AngularJs 应用程序编写单元测试。
默认情况下,在运行我调用以初始化控制器中的数据的测试套件函数时。在运行测试套件时有什么方法可以避免这个调用?
在下面找到代码sn-p:
BaseCtrl.js
App.controller('BaseCtrl', ['$scope', '$rootScope', 'Data', function($scope, $rootScope, Data){
//initialize
$rootScope.loader = false;
$rootScope.data = false;
$scope.init = function(){
$rootScope.loader = true;
Data.init(function(data){
$rootScope.loader = false;
$rootScope.data = data;
});
};
$scope.init();
}])
Data.js
App.service('Data', ['$http', function($http){
return {
init:function(callback){
$http.get('/url').success(function(response){
callback(response);
});
}
};
}]);
BaseCtrl.spec.js
describe('BaseCtrl', function(){
beforeEach(module('app'));
var $controller, $rootScope, $scope;
beforeEach(inject(function(_$controller_, _$rootScope_){
$controller = _$controller_;
$rootScope = _$rootScope_.$new();
}));
describe('Loader', function(){
var controller, $scope = {};
beforeEach(function(){
controller = $controller('BaseCtrl', {$scope:$scope, $rootScope:$rootScope});
});
it('should be false by default', function(){
// Check the default value
expect($rootScope.loader).toBe(false);
// Some code to determine the call, then
expect($rootScope.loader).toBe(true);
// Some code to determine the call is done, then
expect($rootScope.loader).toBe(false);
});
});
});
【问题讨论】:
-
当单元测试你应该期望你的调用被调用......这就是重点。也就是说,为了防止您的调用调用 $httpbackend,您应该改用模拟服务并将它们注册到 Angular 注入器中
-
嗨@DavidL 感谢您的评论,我理解您的意思,但是有什么方法可以在我的测试套件中跟踪/观看呼叫,以便我可以测试其他范围受其影响的数据这个电话。我尝试过使用
spy(Data, 'init'),但它只跟踪我是否从测试规范中调用该方法。 -
当然。如果您监视注入到测试中的 mockedData 服务,您可以使用
spy(Data, 'init').and.callThrough()强制间谍调用您的真实方法。
标签: javascript angularjs unit-testing karma-jasmine