私はUI-ルータにここでユニットテストUI-ルータの設定、UI-ルータの解決関数が戻るとサービスの約束が
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/');
}
を使用して、myAppために持っているサンプルのルート設定で解決した後でさえも予想時に約束しながら、私が今持っている上記のコードの仕様です。私はview1Serviceを嘲笑しているし、約束を返すようにしています(mockedサービスから返されなかった場合、無限のdigest()ループが発生していました)。
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'.
解決ブロックは、上記のように約束オブジェクトを返し続ける理由を任意のアイデア:
しかし、私はエラー以下になっておきます。まずview1Serviceが解決されてから約束を返すべきではありません。そして、私の理解にブロックの呼び出しが約束を返す場合でも、はステートメントがその解決まで待つことを期待していますか?私は呼び出し呼び出しでも.thenを使ってみましたが、どちらもうまくいきませんでした。
ご迷惑をおかけして申し訳ありません。