我有两个角度控制器,通过多个服务异步加载资源。第一个是直接承诺,第二个是使用caolan异步库https://github.com/caolan/async
的简化示例下面的示例代码,http://jsfiddle.net/42taoLet/4/
的实时小提琴var userid="1";
mod.controller('MyCtrl',function($scope,User,Group) {
User.get({user:userid}).then(function(user) {
Group.get({group:user.group}).then(function(group) {
$scope.group = group;
});
});
})
.controller('ACtrl',function($scope,User,Group) {
async.waterfall([
function(cb){
User.get({user:userid}).then(cb);
},
function(user,cb) {
Group.get({group:user.group}).then(cb);
}
],function(group) {
$scope.group = group;
});
});
出于单元测试目的,我删除了User
和Group
。
describe('MyCtrl', function(){
var scope, user, group, $q, userdefer, groupdefer;
beforeEach(function() {
module('app');
inject(function($rootScope,$controller,_$q_) {
scope = $rootScope;
$q = _$q_;
user = {get:sinon.stub()};
userdefer = $q.defer();
user.get.returns(userdefer.promise);
group = {get:sinon.stub()};
groupdefer = $q.defer();
group.get.returns(groupdefer.promise);
$controller('MyCtrl',{$scope:scope,User:user,Group:group});
userdefer.resolve({id:"1",group:"25"});
groupdefer.resolve({name:"AdminGroup"});
scope.$digest();
});
});
it('should set $scope.group to an object',function(){
expect(scope.group).toEqual({name:"AdminGroup"});
});
});
'ACtrl'的测试是相同的。
MyCtrl
次通过的测试; ACtrl
的失败,因为它会立即将其发送到我无法刷新的异步队列。
在将控制权交还给实际测试之前,如何让beforeEach()
完成所有caolan / async回调?
如何刷新通话 - 例如$httpBackend.flush()
或$timeout.flush()
- 这样就完成了? 。