如何使用caolan async lib对使用异步服务调用的角度控制器进行单元测试

时间:2014-10-18 19:01:39

标签: angularjs sinon async.js

我有两个角度控制器,通过多个服务异步加载资源。第一个是直接承诺,第二个是使用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;
  });
});

出于单元测试目的,我删除了UserGroup

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() - 这样就完成了? 。

0 个答案:

没有答案