我有兩個我寫的角度服務。
一個名爲「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塊內部的代碼沒有被警告,所以我的承諾一定不能得到解決或什麼...
感謝您的回覆。我會在午飯後試試這個,看看它是否符合我的需求,然後你會接受:) – Zack 2014-12-02 18:05:27
這仍然不是我想要的不幸。 )。然後(函數(RES){警報(RES);}); 沒有任何提示。 – Zack 2014-12-03 15:43:55
嘗試在假設你沒有使用1.3之後嘗試添加'$ rootScope.digest()'。我不知道我是否在使用1.3 – 2014-12-03 15:54:57