во время модульного тестирования конфигурации ui-router функция разрешения ui-router возвращает обещание во время ожидания даже после того, как обещание службы было разрешено

Ниже приведен пример конфигурации маршрута, который у меня есть для myApp с использованием ui-router.

    angular.module('myApp', ['ui.router']);

    angular.module('myApp').config(stateConfig);

    stateConfig.$inject = ['$stateProvider','$urlRouterProvider'];

    function stateConfig($stateProvider, $urlRouterProvider) {  
        $stateProvider.state('view1', {
            url: '/view1/:id?',
            templateUrl: 'app/view1/view1.html',
            resolve:{
                init: ['$stateParams', 'view1Service', function($stateParams, view1Service){
                    if($stateParams.id !== ''){
                        return view1Service.getIdData($stateParams.id)
                            .then(function(response){
                                return { data: response.data, responseStatus: response.status };                            
                            }, function(response){
                                return { data:{}, responseStatus: response.status }; 
                            });
                    }
                    else{
                        return { data:{}, responseStatus: 200 };
                    }
                }]
            },
            controller: 'View1Controller as controllerOne'
        })
        //some other routes with similar configuration

        $urlRouterProvider.otherwise('/view1/');
    }

Вот спецификация для приведенного выше кода, который у меня есть на данный момент. Поскольку функция разрешения для состояния view1 зависит от view1Service, я издевался над view1Service, а также заставил его возвращать обещание (если обещание не было возвращено из имитируемой службы, тогда происходил бесконечный цикл дайджеста()).

    describe('ui router config', function() {

        var $rootScope, $state, $injector, myServiceMock, state = 'view2', deferred, mockedService;

        beforeEach(function() {
            angular.mock.module('myApp');
            angular.mock.module('ui.router');

            angular.mock.module(function($provide){
                $provide.factory('view1Service', function($q){
                    function getIdData(id){
                        deferred = $q.defer();
                        return deferred.promise;
                    }
                    return {getIdData: getIdData}
                });
            });

            inject(function(_$rootScope_, _$state_, _$injector_, $templateCache, _$stateParams_, view1Service) {
                    $rootScope = _$rootScope_;
                    $state = _$state_;
                    $injector = _$injector_;
                    $stateParams = _$stateParams_;
                    $templateCache.put('app/view1/view1.html', '')
            })
        });

        it('should respond to URL', function() {
            expect($state.href(state, { id: 1 })).toEqual('#/view1/1');
        });

        it('should resolve data', function() {
            $state.go(state, {id: '9999'});
            deferred.resolve({
                data: 'some data',
                status: 666
            });
            $rootScope.$digest();
            expect($state).toBe('checking');
            expect($state.current.name).toBe(state+'q');

            // Call invoke to inject dependencies and run function
            expect($injector.invoke($state.current.resolve.init)).toBe('findAll+1');//this assertion fails with below error

        });

    });

В настоящее время я могу утверждать о текущем состоянии. Я хотел бы также проверить обратный вызов успеха и отказа функции разрешения.

Однако я продолжаю получать следующую ошибку:

    Expected Promise({ $$state: Object({ status: 0 }) }) to be 'findAll+1'.

Любая идея, почему блок разрешения продолжает возвращать объект Promise, как указано выше. Прежде всего, он не должен возвращать обещание, так как view1Service был разрешен. И насколько я понимаю, даже если вызов блока разрешения возвращает обещание, оператор ожидает не ждет, пока он не будет разрешен? Я пытался даже использовать .then при вызове вызова, это тоже не сработало.

Любая помощь горячо приветствуется.


person Pramodh    schedule 10.04.2016    source источник


Ответы (1)


Вы переходите в состояние, которое вызывает функции разрешения, а затем вы «разрешаете ()» свой отложенный. Все хорошо здесь. Но позже вы вызываете функцию инициализации, которая возвращает обещание, и это хорошо. Но вы хотите разрешить отложенное после этого, теперь, когда оно было настроено.

По сути, я думаю, что вы вызываете «init» дважды, один раз, когда вы вызываете «$ state.go», и снова явно после этого.

Вы должны иметь возможность сначала выполнить $state.get('view1').resolve.init, чтобы получить функцию инициализации, которую вы хотите протестировать напрямую. В противном случае вызов "$state.go" запустит его автоматически.

Надеюсь, это поможет!

person Harmon    schedule 09.05.2016