我正在尝试在控制器中对$scope.$watch
进行单元测试,我不知道为什么测试代码中的$scope.$apply()
会导致意外的请求错误,例如Error: Unexpected request: GET /locales/en.json
。这是控制器的另一部分,为什么它在这里涉及?
但是,如果我评论$scope.$apply
,则不会发生此错误,但当然在这种情况下无法触发$ watch。我是否必须嘲笑$httpBackend.whenGET('/locales/en.json').respond('');
之类的请求?
控制器:
$scope.$watch(function(){
return $location.path();
}, function() {
$scope.currentPath = $location.path().match(/\/[a-z0-9A-Z_]*/)[0];
$scope.currentNav = 'menu.' + $scope.currentPath.replace('/', '');
});
茉莉:
describe('homeController', function() {
beforeEach(module('homeApp'));
var $rootScope, $scope, controller, $httpBackend, $location, $route, $window
beforeEach(inject(function($controller, _$rootScope_, _$httpBackend_, _$location_, _$route_, _$window_) {
$rootScope = _$rootScope_;
$scope = $rootScope.$new();
controller = $controller('homeController', {$scope: $scope});
$httpBackend = _$httpBackend_;
$location = _$location_;
$route = _$route_;
$window = _$window_;
}));
describe('watch path', function() {
it('should change currentPath and currentNav', function() {
$location.path('/dashboard');
$scope.$apply();
$location.path('/images');
$scope.$apply();
expect($scope.currentPath).toBe('/images')
expect($scope.currentNav).toBe('menu.images')
})
})
})
更新:
在模拟所需的所有http请求后,它正在工作。但仍想知道它为何会影响这些请求。
答案 0 :(得分:-1)
在上面的例子中,你没有看任何东西。当观察对象的值发生变化时,将调用$ watch函数。它会返回对象的旧值和新值。
$scope.someValue = 0;
$scope.$watch(
"$scope.someValue",
function handleFooChange(newValue, oldValue) {
console.log("$scope.someValue:", newValue);
}
);
这里有一些人正在接受改变。一旦someValue的值改变,将调用$ watch的回调函数。