2013-07-25 2 views
0

Я пытаюсь написать тесты единиц для вложенного состояния. Состояние наследует некоторые элементы области из родительского состояния. В моих тестах я создаю контроллер, который, очевидно, не имеет видимости родительского состояния и, следовательно, не имеет видимости унаследованных элементов области.Наследование наследования углового интерфейса UI-Router

it('should show the account page', inject(['$controller', 'security', function ($controller, security){ 
    // set up controller with a scope 
    var $scope = $rootScope.$new(); 

    // the parent controller calls this 
    var user = { first: 'First', last: 'Last', email: '[email protected]', gender:'male', hasPassword:true}; 
    $httpBackend.when('GET', '/api/user/current-user').respond(200, user); 
    $controller('AccountViewCtrl', { $scope: $scope}); 

    $rootScope.$digest(); 

    // verify the initial setup 
    //scope attributes defined on the parent controller 
    expect($scope.user).toEqual(user); 
    expect($scope.account).toEqual(user); 

    // scope attribute defined on the controller 
    expect($scope.genders.length).toEqual(2); 
    expect($scope.editable).toBe(false); 
    expect($scope.editCheck()).toBe(false); 
}])); 

AccountCtrl определяет ряд элементов, необходимых для всех дочерних состояний.

.controller('AccountCtrl', ['$scope', 'security', function ($scope, security){ 
    $scope.user = security.requestCurrentUser(); 
    $scope.account = angular.copy($scope.user); 
}]) 

AccountViewCtrl определяет другие элементы, но наследует элементы от родительского AccountCtrl

.controller('AccountViewCtrl', ['$scope', function ($scope) { 
    $scope.editable = false; 
    $scope.genders = [ 
    { name: 'Male', value: 'male' }, 
    { name: 'Female', value: 'female' } 
    ]; 

    $scope.editCheck = function(){ 
    return $scope.editable; 
    }; 

    .... 
}]) 

Тестов неисправными, как я только инстанцирование контроллера и нет видимости родительского состояния и связанных элементов. Существует ли наилучший подход к тестированию состояний ui-router?

ответ

0

Наследование области является функцией Углового. Поэтому я считаю, что нет необходимости тестировать в моих тестах.

Мой обходной путь, чтобы проверить, что AccountCtrl работает, а затем просто положить значения в других тестах:

it("should set scope when account Ctrl loaded", inject(['$controller', 'security', function($controller, security){ 
    // Add your behavior testing code here 
    var $scope = $rootScope.$new(); 
    var user = { first: 'First', last: 'Last', email: '[email protected]', gender:'male', birthday:'password'}; 
    security.currentUser = user; 
    $controller('AccountCtrl', { $scope: $scope}); 
    $rootScope.$digest(); 

    // verify the initial setup 
    expect($scope.user).toEqual(user); 
    expect($scope.account).toEqual(user); 
}])); 

Тогда в остальных тестах я вручную заполнить значения:

it('should set scope on account page', inject(['$controller', 'I18N.MESSAGES', function ($controller, i18nMessages){ 
    // set up controller with a scope 
    var $scope = $rootScope.$new(); 
    var user = { first: 'First', last: 'Last', email: '[email protected]', gender:'male', birthday:'password'}; 
    $scope.account = $scope.user = user; 
    ... 
}])); 
Смежные вопросы