Skip to main content
 首页 » 编程设计

angularjs之如何在 Jasmine 单元测试中解决$ q.all promise

2024年09月07日21yyy_WW

我的 Controller 具有如下代码:

$q.all([qService.getData($scope.id), dService.getData(), qTService.get()]) 
.then(function (allData) { 
  $scope.data1 = allData[0]; 
  $scope.data2 = allData[1]; 
  $scope.data3 = allData[2]; 
}); 

在我的单元测试中,我正在做这样的事情:

beforeEach(inject(function($rootScope, $q, $location){// and other dependencies...  
  qServiceSpy = spyOn(_qService, 'getData').andCallFake(function () { 
    var data1 = { 
      id: 1, 
      sellingProperty: 1, 
    }; 
    var d = $q.defer(); 
    d.resolve(data1); 
    return d.promise; 
  }); 
 
  dServiceSpy = spyOn(_dService, 'getData').andCallFake(function () { 
    var data2 = [{ "id": "1", "anotherProp": 123 }]; 
    var d = $q.defer(); 
    d.resolve(data2); 
    return d.promise; 
  }); 
  qTServiceSpy = spyOn(_qTService, 'get').andCallFake(function () { 
    var data3 = [{ id: 0, name: 'Rahul' }]; 
    var d = $q.defer(); 
    d.resolve(data3); 
    return d.promise; 
  }); 
  rootScope = $rootScope; 
}); 

现在在测试中,我正在检查是否调用了服务,并且data1,data2是否未定义。

it('check if qService' got called, function() { 
  expect(scope.data1).toBeUndefined(); 
  rootScope.$digest(); 
  expect(_quoteService.getQuote).toHaveBeenCalled(); 
}); 
it('check if "data1" is defined', function () { 
  expect(scope.data1).toBeUndefined(); 
  rootScope.$digest(); 
  expect(scope.data1).toBeDefined(); 
}); 

我的问题是,这一直很好,直到我用q.all替换了 Controller 中的单个服务调用,并用 scope.$apply替换了测试 rootScope.$digest。使用q.all和 rootScope.$digest(也使用 scope.$apply尝试过),两个测试均失败并显示以下错误:

10 $digest() iterations reached. Aborting!



如果我删除 rootScope.$digest,则 promise 将永远无法解决,测试将失败

expected undefined to be defined.



任何帮助我应如何使用 q.all单元测试代码?

碰到 this post

但这也无济于事,因为我已经在尝试使用 $digest

请您参考如下方法:

您可以尝试将$rootScope.$apply()放入afterEach()回调函数中。 promise 在Angular中解决$apply()

afterEach(function(){ 
    rootScope.$apply(); 
});