如何在Angular中测试$ watch

时间:2016-04-20 04:44:34

标签: angularjs jasmine

我正在尝试在控制器中对$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请求后,它正在工作。但仍想知道它为何会影响这些请求。

1 个答案:

答案 0 :(得分:-1)

在上面的例子中,你没有看任何东西。当观察对象的值发生变化时,将调用$ watch函数。它会返回对象的旧值和新值。

$scope.someValue = 0;

  $scope.$watch(
    "$scope.someValue",
    function handleFooChange(newValue, oldValue) {
     console.log("$scope.someValue:", newValue);
    }
  );

这里有一些人正在接受改变。一旦someValue的值改变,将调用$ watch的回调函数。