2014-12-02 147 views
1

我有兩個我寫的角度服務。

一個名爲「searchAPI」的實質上接受用戶輸入,形成彈性搜索查詢,然後通過$ http.get調用將其關閉。

//searchAPI 

service = { 
    executeSearch: function(input, resultsPerPage, pageNumber){ 
     request = // some well tested logic that I know works to create a query string 
     return $http.get(request); 
    } 
} 

另一個叫做typeAhead,它使用我的searchAPI獲取typeAhead結果列表。

//typeAhead 

service = { 

    typeAheadContent: [], 

    buildTypeAheadContent: function(input){ 
     return searchAPI.executeSearch(input, 10, 1).then(function(res){ 
      for(var i = 0; i < res.length; i++){ 
       service.typeAheadContent.push(res[i]); 
      } 
     }); 
    }, 

    getTypeAheadResults: function(input){ 
     return service.buildTypeAheadContent(input).then(function(){ 
      return service.typeAheadContent; 
     });  
    } 
}; 

這裏有幾件事。

1)我仍然得到角度的掛鉤,所以我不知道我的諾言設置是否完全達到標準。除了我的typeahead之外,我還有其他一些用於searchAPI請求構建功能的用途,這就是爲什麼我想讓請求構建器/ firer成爲它自己獨立的東西。

2)我需要幫助測試這種類型的前端服務。對於單元測試,我如何確保searchAPI實際上不會到我的後端,而是返回一些模擬數據或模擬諾言或其他東西?如果我能做到的話,這樣的事情會很理想。

searchAPI.executeSearch = function(){ 
    return [ 
     'item1', 
     'item2', 
     'item3' 
    ] 
} 

我想在我的茉莉花測試做這樣的事情,但以這種方式嘲笑它,我不調用一個承諾,只設置一個返回值。

有人可以幫我開始我的設置並嘲笑一些承諾嗎?

////編輯////

這是我在我的茉莉花測試每個功能之前。

var searchAPI, typeAhead; 
beforeEach(inject($rootScope, $injector, $q) 
{ 
    typeAhead = $injector.get('typeAhead'); 
    searchAPI = $injector.get('searchAPI'); 
    searchAPI.executeSearch = function(input, resultsPerPage, pageNumber){ 

     // this is being alerted just fine 
     alert("Inside mock"); 
     return $q.when([ 
      'item1', 'item2', 'item3' 
     ]); 
    } 
    $rootScope.$digest(); 
})); 

it('should construct typeahead stuff', function(){ 

    searchAPI.executeSearch("hello", 10, 1).then(function(res){ 

     //this is not being alerted 
     alert(res); 
    }); 
    typeAhead.buildTypeAheadContent("test"); 
}); 

所以我包含了一些東西來幫助調試。警告「Inside Mock」的代碼行確實被警告,所以我知道我分配給executeSearch的模擬事件正在正確設置。然而,.then塊內部的代碼沒有被警告,所以我的承諾一定不能得到解決或什麼...

回答

1

你對Promise的使用聽起來很好,並達到它應該看起來的樣子。那很好。

至於你的問題 - 我可能會嘲笑它反映原始API - 到模擬的承諾與靜態值 - 您可以使用$q.when

searchAPI.executeSearch = function(){ 
    return $q.when([ 
     'item1', 
     'item2', 
     'item3' 
    ]); 
}; 

$q.when轉換外國(非角)的承諾或對Angular承諾的簡單價值 - 在這種情況下是您的數組。

+0

感謝您的回覆。我會在午飯後試試這個,看看它是否符合我的需求,然後你會接受:) – Zack 2014-12-02 18:05:27

+0

這仍然不是我想要的不幸。 )。然後(函數(RES){警報(RES);}); 沒有任何提示。 – Zack 2014-12-03 15:43:55

+0

嘗試在假設你沒有使用1.3之後嘗試添加'$ rootScope.digest()'。我不知道我是否在使用1.3 – 2014-12-03 15:54:57