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

标签 angularjs unit-testing jasmine karma-runner jasmine-jquery

我的 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();
});

关于angularjs - 如何在 Jasmine 单元测试中解决$ q.all promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16316940/

相关文章:

javascript - Hello world 依赖注入(inject)示例

javascript - AngularJS 上的工厂无法正常工作。错误 "Cannot read property ' getInfoApi' 未定义”

unit-testing - 在 flutter 中测试 kIsWeb 常量

javascript - 使用 Jasmine 测试 Javascript 函数

jasmine - Webpack 已使用与 API 架构不匹配的配置对象进行初始化

javascript - 如何对非空 json 使用 ng-switch-when?

angularjs - 使用 ui 路由器的范围和 Controller 实例化

unit-testing - 降低大型软件开发项目中的缺陷注入(inject)率

java - Hamcrest 中的 JUnit Assert#assertSame 等价物

javascript - Angular 2 : How to unit test tabs component with tightly coupled parent and child components