我的控制器$scope.get
中有另一种方法$rootScope.search
。我正在使用Karma和Jasmin编写单元测试。
当我尝试测试方法$rootScope.search
时会抛出错误,我做错了什么?
代码如下:
Ctrl.js
App.controller('Ctrl', ['$scope', '$rootScope', function($scope, $rootScope){
$scope.get = function(search){ // return some data from service };
$rootScope.search = function(data){
$scope.get(data);
};
}]);
Ctrl.spec.js
describe('Ctrl', function(){
beforeEach(module('app'));
var $controller, $scope = {}, $rootScope = {};
beforeEach(inject(function(_$controller_, _$rootScope_){
$controller = _$controller_;
$rootScope = _$rootScope_;
}));
describe('Data', function(){
beforeEach(function() {
$controller('Ctrl', { $scope:$scope, $rootScope:$rootScope});
spyOn($scope, 'get');
});
it('$rootScope.search', function(){
$rootScope.search();
expect($scope.get).toHaveBeenCalled();
});
})
});
错误
TypeError: $scope.get is not a function at Scope.$rootScope.search
请帮忙。
答案 0 :(得分:1)
实际上我必须在视图中使用相同的全局方法。
如果要在$ rootScope上提供全局方法,请从.run
块而不是控制器执行此操作。
App.run([$rootScope', function($rootScope){
function get = function(search){ // return some data from service };
$rootScope.search = get;
}]);
但建议将方法放在工厂中。
App.factory('mySearch', function(){
function get = function(search){ // return some data from service };
return { search: get };
});
然后在您的控制器中注入自定义搜索:
App.controller('Ctrl', ['$scope', 'mySearch', function($scope, mySearch){
var vm = $scope;
vm.data = mySearch.search(data);
}]);