2016-02-19 90 views
2

我有一個相當直接的測試,對Angular承諾,我在beforeEach函數中解決,但在我的代碼是不會解僱的,然後我不能看看我錯過了什麼。這些都是用TypeScript編寫的,但這對問題沒有任何影響。茉莉花測試與角落的諾言不解決與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() { 
    this.drillReport({ drillReport: drillReport }) 
    .then((results: Models.drillData) => { 
     parent.processResults(results, parent.availableDrills, this.columns, this.gridOptions, undefined, undefined); 
    }); 
} 

回答

3

你所缺少的是,你將需要訪問使用$scope,或$rootScope,所以你可以調用並強制消化循環...

$scope.$digest(); 

該rea兒子需要的是解析和拒絕的承諾在摘要循環中處理。所以,當你在模擬中解決諾言時,真正的諾言回調不會被調用。

+0

謝謝。我知道,但已經忘記了。 –

0

繼續了@Brocco的說法,您的代碼在處理承諾之前調用done()。

你需要一種方法讓你的測試代碼知道parent.processResults()已被調用。

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