在角度控制器中测试$ q.all的输出

时间:2014-06-19 16:15:05

标签: angularjs jasmine

我的控制器执行类似下面的操作(请注意,为简单起见,我没有显示所有依赖项):

.controller('demo',function(){

      fn1(){
          var defereed = $q.defer;
          /* fetch data from server and once the data is fetched perform a resolve */
          return deferred.promise;
      }

     fn2(){
        var defereed = $q.defer;
          /* fetch data from server and once the data is fetched perform a resolve*/      
          return deferred.promise;
     }

     fun3() { /*makes some server side calls and updates the view*/}

     $q.all([fn1(),fn2()] .then(function(result){
           if (result[0]) { fn3();}
       });

    }

在这种情况下,我很难测试fn3()是否被调用。我也无法让fn1()和fn2()解析,以便我可以测试fn3()

任何提示都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

终于找到了解决方案..对于那些有兴趣的人来看看这个plnkr: http://plnkr.co/HkaQdH

describe('Testing: MainCtrl', function() {
  var $scope = null;
  var ctrl = null;
  var mockInitService;
  var defer1,defer2;
  var $q;

  beforeEach(module('plunker'));

  beforeEach(inject(function($rootScope, $controller,$q) {
    $scope = $rootScope.$new();
    $q = $q;

    mockInitService = {
      fn1: function(){},
      fn2: function(){},
      fn3: function(){}
    };
    defer1 = $q.defer();
    defer2 = $q.defer();

    spyOn(mockInitService,'fn1').and.returnValue(defer1.promise);
    spyOn(mockInitService,'fn2').and.returnValue(defer2.promise);
    spyOn(mockInitService,'fn3');

    createController = function() {
      return $controller('MainCtrl', {
        $scope: $scope,
        InitService: mockInitService
      });
    }

  }));

  it('Should call InitService.fn3', function() {
    ctrl = createController();
    defer1.resolve();
    defer2.resolve();
    $scope.$digest();
    expect(mockInitService.fn3).toHaveBeenCalled();
  });

});