使用Angular Promise进行的Jasmine测试无法使用TypeScript

时间:2016-02-19 14:36:38

标签: javascript angularjs typescript jasmine angular-promise

我有一个相当直接的测试,它违背了一个Angular承诺,我在beforeEach函数中解析了,但是我的代码中的那个并没有被解雇,我无法看到我&#39我失踪了。这些都是用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);
    });
}

2 个答案:

答案 0 :(得分:3)

您缺少的是您需要使用$scope$rootScope,以便您可以致电并强制进行摘要周期......

$scope.$digest();

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

答案 1 :(得分:0)

跟进@Brocco所说的,你的代码在处理promise之前调用done()。

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

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