Ниже приведен пример конфигурации маршрута, который у меня есть для 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 при вызове вызова, это тоже не сработало.
Любая помощь горячо приветствуется.