2016-03-30 60 views
0

我想單元測試使用$resource的AngularJS服務。爲了保持它的獨立性,我想用茉莉花的間諜和間諜在$resourcequery()方法。在我的控制器中,我希望能夠使用簡短形式的query(),您可以在不調用$promise.then(success, error)的情況下將成功和錯誤功能直接傳遞給查詢方法。這是可能的,還是我堅持長的形式query().$promise.then(success, error)

下面是我用一個失敗的測試說明我的問題創造了一個plunker:http://plnkr.co/edit/hVc2YNnwUDNv7IHODOMD?p=preview

我發現在SO聲稱解決問題的幾個問題,但是所有使用的更老的版本,我使用的組件。從plunker你可以看到我正在使用Angular 1.5.2和Jasmine 2.4.1。

作爲一個相關的問題,許多教程顯示,在您的控制器中,您可以將返回值query()分配給一個數組,並且隨着數據加載,數組將被更新。這是最乾淨的解決方案,但如果發生錯誤會發生什麼?我希望如果加載數據時出現問題,您最終只能得到一些默認的錯誤通知,或根本沒有任何事情發生。最好的做法是通過攔截器處理其他地方的錯誤,並且可能觸發事件並以某種通用的非控制器特定方式通知用戶?我認爲攔截器需要一些方法來確定向用戶顯示什麼信息以給出一些上下文,例如「百吉餅加載似乎比平時花費的時間更長,點擊此處重試」,而不是「某些請求返回500狀態代碼'

回答

1

您應該仍然可以使用函數作爲查詢(成功,錯誤)傳遞的函數。要修復需要,如下所示,以考慮的誤差函數單元測試:

spyOn(mockBagelApiService, 'query').and.callFake(function(callback1, callback2) { 
    queryDeferred.promise.then(callback1); 
    queryDeferred.promise.catch(callback2); 
    return {$promise: queryDeferred.promise} 
    }); 

callFake將在你進入query()這對於成功和錯誤兩個函數的參數。根據promise是否已被解決或被拒絕,您需要使用適當的回調來處理then和catch塊。

我在我的角應用程序中處理請求錯誤的方式是創建一個錯誤處理程序服務,該服務在catch塊中被調用,並將接收特定的錯誤消息並彈出一個模式。您可以根據需要對其進行配置:您可以定義模式按鈕以重新加載或重定向等。要處理消息,可以配置服務以返回問題代碼,以描述情況,如USER_IS_NOT_AUTHOAUTH_ERROR您的錯誤處理程序可以用來提供更具體的響應。