[英]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.