簡體   English   中英

使用Angular Promise進行Jasmine測試無法使用TypeScript解決

[英]Jasmine Testing with Angular Promise not resolving with TypeScript

我有一個相當簡單的測試,可以對Angular promise進行工作,我在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所說的內容,您的代碼在處理Promise之前調用了done()。

您需要的是一種讓測試代碼知道已調用parent.processResults()

我建議您刷新后返回一個諾言,該諾言將在parent.processResults()之后解決,並添加controller.refresh().finally(() => { done(); }); 在您的測試代碼中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM