我已经写了两个角度服务。
一个名为“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)我仍然得到角度的悬念,所以我不知道我的承诺设置是否完全达到标准。除了我的预先输入之外,我还有其他用于searchAPI请求构建功能的用法,这就是为什么我想让请求构建器/ firer成为它自己独立的东西。
2)我需要帮助测试这种typeAhead服务。对于单元测试,我如何确保searchAPI实际上不会转到我的后端,而是返回一些模拟数据或模拟承诺或什么?如果我能做的话,这样的事情将是理想的。
searchAPI.executeSearch = function(){
return [
'item1',
'item2',
'item3'
]
}
我尝试在我的茉莉花测试中做这样的事情,但是以这种方式嘲笑它,我没有调用一个承诺,只是设置一个返回值。
有人可以帮我开始设置并嘲笑一些承诺吗?
//// //// EDIT
这是我在茉莉花测试中的每个功能之前的事。
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块中的代码没有被警告,因此我的承诺不能被解决或者某事......
答案 0 :(得分:1)
你对promises的使用听起来很不错,并且与它看起来的样子相当。那很好。
至于你的问题 - 我可能会嘲笑它以反映最初的API - 用静态值模拟承诺 - 你可以使用$q.when
:
searchAPI.executeSearch = function(){
return $q.when([
'item1',
'item2',
'item3'
]);
};
$q.when
将外来(非Angular)承诺或简单值转换为Angular承诺 - 在本例中为您的数组。