我的角度模块中定义了状态" moduleB"如下
$stateProvider
.state('stateB', {
parent: 'stateA',
abstract: true,
templateUrl : baseUrl+'/templates/stateB.html'
})
.state('stateB.details', {
url: '/stateB/details/:param1/:param2',
resolve : {
value3 : ['$localStorage', '$stateParams', function($localStorage, $stateParams){
return $localStorage.value3[$stateParams.param1];
}]
},
views : {
'view1' : {
templateUrl : baseUrl+'/templates/view1.html',
controller: 'View1Ctrl'
},
'view2' : {
templateUrl : baseUrl+'/templates/view2.html',
controller : 'View2Ctrl'
}
}
})
我想为" resolve"编写单元测试。这是我的茉莉花单元测试。
var rootScope, state, injector, mockLocalStorage, httpBackend;
beforeEach(module('moduleB'));
beforeEach(inject(function($rootScope, $state, $injector, $localStorage, $httpBackend) {
rootScope = $rootScope;
state = $state;
injector = $injector;
httpBackend = $httpBackend;
mockLocalStorage = $localStorage;
}));
it('should should resolve the data', function() {
mockLocalStorage.value3 = {};
mockLocalStorage.value3["1234567890"] = 'resolved-data';
state.go('stateB.details', {
"param1" : "1234567890",
"param2" : true
});
rootScope.$digest();
console.log('state', state);
expect(state.current.name).toBe('stateB.details');
expect(injector.invoke(state.current.resolve.value3)).toBe('resolved-data');
});
1)console.log('州',州)==>版画 ' state',Object {params:Object {},current:Object {name:'',........}
2)expect(state.current.name).toBe(' stateB.details')==>失败,错误 期待''成为州政府.details'。
3)期待解决==>失败,错误 TypeError:' undefined'不是一个对象(评估' state.current.resolve.value3')
任何人都可以帮助指出我错过了什么吗?
更新:
我修改了我的测试,在promise的成功块中有断言。 即使断言是假的,它也会通过测试。
it('should resolve the data', function() {
mockLocalStorage.value3 = {};
mockLocalStorage.value3["1234567890"] = 'resolved-data';
state.go('stateB.details', {
"param1" : "1234567890",
"param2" : true
}).then(function() {
console.log('state', state);
expect(state.current.name).toBe('stateB.details'); expect(injector.invoke(state.current.resolve.value3)).toBe('resolved-data2');
});;
});
此测试通过并且没有显示" console.log(' state',state);" 。 而且,我对'解析数据2"的断言应该失败,因为期望值是"已解决 - 数据"。
答案 0 :(得分:9)
最后,我解决了这个问题。这是任何感兴趣的人的解决方案。
1)导入模块
beforeEach(module('stateA'));
beforeEach(module('stateB'));
beforeEach(module('ui.router'));
2)
beforeEach(module(
function($provide) {
$provide.value('$localStorage', mockStorage = { value3: []});
$provide.value('$stateParams', stateParams = { param1: 1234, param2: "true"});
}));
3)单元测试:
it('should go to stateB.details state and resolve the data', function() {
mockStorage.assetInfo[stateParams.value3] = 'resolved-data';
var s = state.get('stateB.details');
expect(injector.invoke(s.resolve.value3)).toEqual('resolved-data');
});