2
我有一個控制器,它使用的服務在成功時具有回調函數。在AngularJS控制器中測試回調服務規範
控制器功能
itemCtrl.save = function() {
ItemService.save({ username: SessionService.getUsername() }, itemCtrl.item, function (res) {
$scope.$emit('UPDATE_ITEMS');
$modalInstance.close(res);
});
};
規範
it('should close the modal on successful save', function() {
spyOn(itemSrv, 'save').and.callFake(function() {
deferred = q.defer();
deferred.resolve();
return deferred.promise;
});
spyOn(modalInst, 'close').and.callThrough();
ItemCtrl.save();
scope.$digest();
expect(modalInst.close).toHaveBeenCalled();
});
當我運行這個測試在業力失敗,因爲modalinstance的關閉功能不叫。我認爲問題出在規範說明上,因爲功能在應用程序中運行。 我對此有幾個問題:
- 這是描述控制器服務調用回調的最佳方式嗎?
- 我應該如何使用回調描述我的規格?
- 編輯 -
我已經改變了我的服務電話,使他們處理結果的承諾:
itemCtrl.save = function() {
ItemService.save({ username: SessionService.getUsername() }, horas.trabajo).$promise.then(function (res) {
$scope.$emit('UPDATE_ITEMS');
$modalInstance.close(res);
});
};
我想我沒有通過測試,因爲我的服務呢不返回一個承諾(它有一個承諾屬性,我打電話發出事件並關閉modalInstance)。但是我仍然對如何使用ng-resource返回承諾感到困惑。
我試圖解決它是返回一個$ promise屬性的對象,它包含q提供的承諾。
規範
it('should close the modal on successful save', function() {
spyOn(itemSrv, 'save').and.callFake(function() {
deferred = q.defer();
deferred.resolve();
return {$promise: deferred.promise};
});
spyOn(modalInst, 'close').and.callThrough();
ItemCtrl.save();
scope.$digest();
expect(modalInst.close).toHaveBeenCalled();
});
如果我改變它並返回一個承諾,我應該能夠像我在問題中那樣測試,對吧? – lerp90
是的,你在那裏的測試代碼應該是相同的 – Brocco
我已經在第一篇文章的底部添加了解決它的嘗試,我想我對promises和ng-resource有點困惑。 – lerp90