2015-05-26 40 views
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(); 
}); 

回答

3

你感到困惑的承諾和回調的概念,而是要得到它的工作,你現在擁有它,你可以使用這個:

spyOn(itemSrv, 'save').and.callFake(function (params, callback) { 
    callback({some: 'response'}); 
}); 

回調

您傳遞的函數將根據場景

無極

找回它包含了它的方法(當時)的對象,它將調用要麼成功一號PARAM或錯誤

第二PARAM還有更多的都,但這是一個總體概述。

此外,我建議更改您的服務中的save方法以返回承諾而不是接受回調。

+0

如果我改變它並返回一個承諾,我應該能夠像我在問題中那樣測試,對吧? – lerp90

+1

是的,你在那裏的測試代碼應該是相同的 – Brocco

+0

我已經在第一篇文章的底部添加了解決它的嘗試,我想我對promises和ng-resource有點困惑。 – lerp90

相關問題