Я пытаюсь выполнить единицу теста $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-запросам. Но все же хотите знать, почему это влияет на эти запросы.
В приведенном выше примере вы ничего не наблюдаете. Функция $ watch будет вызываться, когда изменяется значение наблюдаемого объекта. Он вернет вам как старое, так и новое значение для объекта.
$scope.someValue = 0;
$scope.$watch(
"$scope.someValue",
function handleFooChange(newValue, oldValue) {
console.log("$scope.someValue:", newValue);
}
);
Здесь someValue просматривается для изменения. Как только значение someValue изменится, будет вызвана функция обратного вызова $ watch.
$scope.watch
ожидает параметр, который вызывает$scope.apply
вот ваш $ scope.watch, вызывающий проблему