Jasmine Testing with Angular Promise 无法使用 TypeScript 解析

Jasmine Testing with Angular Promise not resolving with TypeScript

本文关键字:TypeScript 解析 Testing with Angular Promise Jasmine      更新时间:2023-09-26

我有一个相当简单的测试,它针对 Angular 承诺起作用,我在 beforeEach 函数中解决了这个问题,但我的代码中的 then 永远不会触发,我看不到我错过了什么。 这些都是用TypeScript编写的,但这实际上与问题没有任何关系。

这是我的测试

describe('Refresh->', () => {
  var controller = new Directives.Reporting.ReportDirectiveController($scope, $q, $location);
  var called = false;
  var defer: any;
  beforeEach((done) => {
    controller.drillReport = (drillReport: Models.drillReport): ng.IPromise<Models.drillData> => {
      defer = $q.defer();
      called = true;
      defer.resolve({});
      return defer.promise;
    };
    spyOn(controller, 'processResults');
    controller.refresh();
    done();
  });
  it('Calls DrillReport', () => {
    expect(called).toBeTruthy();
  });
  it('Calls ProcessResults', () => {
    expect(controller.processResults).toHaveBeenCalled();
  });
});

控制器中的 Refresh 方法如下所示:

refresh() {
  this.drillReport({ drillReport: drillReport })
    .then((results: Models.drillData) => {
      parent.processResults(results, parent.availableDrills, this.columns, this.gridOptions, undefined, undefined);
    });
}

您缺少的是您需要访问才能使用 $scope$rootScope ,以便您可以调用并强制摘要循环......

$scope.$digest();

需要这样做的原因是,在摘要循环期间处理已解决和拒绝的承诺。因此,当您在模拟中解析承诺时,不会调用实际的承诺回调。

按照@Brocco所说的,你的代码在处理承诺之前调用done()。

你需要的是一种让你的测试代码知道该parent.processResults()已被调用的方法。

我建议你让刷新返回一个承诺,该承诺将在parent.processResults()后解决,并在测试代码中添加controller.refresh().finally(() => { done(); });