0

$parentスコープ変数を監視している場合、ウォッチャーをどのようにテストできますか? たとえば、私は子のスコープを持っています:

$scope.$parent.$watch('activeId', function (hotelId) {
    $scope.select(activeId);
});

現在、テストは次のようになっています。

...

    beforeEach(inject(function (_$controller_, _$rootScope_) {

       $scope = _$rootScope_.$new();
       $parentScope = _$rootScope_.$new();

       $controller = _$controller_('ChildCtrl', {'$scope': $scope});
       $parentController = _$controller_('ParentCtrl', {'$scope': $parentScope});
    }));

    describe('select', function () {
        beforeEach(function () {
           spyOn($scope, 'select');
        });
        it('should call select', function () {
           $parentScope.setActiveId(1);
           $parentScope.$digest();

           expect($scope.select).toHaveBeenCalled();
        });
    });
});

しかし、残念ながらこのテストは失敗します。

4

1 に答える 1

1

次のように親コントローラーを提供することにより、 $parent を $scope に追加することで、この問題を処理し、テストに合格できたようです。

describe('Controller: TestController', function () {

    beforeEach(module('App'));

    var $controller, $scope, $parentController, $parentScope;

    beforeEach(inject(function (_$controller_, _$rootScope_) {

        $scope = _$rootScope_.$new();
        $parentScope = _$rootScope_.$new();
        $scope.$parent = $parentScope;

        $parentController = _$controller_('ParentController', {'$scope': $parentScope});
        $controller = _$controller_('ChildCtrl', {'$scope': $scope});
    }));
    it('should get $parent variable', function () {
        var userId=$scope.$parent.vm.userId;
        var simId=$scope.$parent.vm.simId;
    })
       describe('select', function () {
        beforeEach(function () {
           spyOn($scope, 'select');
        });
        it('should call select', function () {
           $scope.$parent.setActiveId(1);
           $scope.$parent.$digest();

           expect($scope.select).toHaveBeenCalled();
        });
    });
});
于 2016-04-14T14:27:14.043 に答える