У меня есть два угловых сервиса, которые я написал.
Один называется «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) Я все еще осваиваю angular, поэтому я не знаю, полностью ли мои настройки обещания соответствуют номиналу или нет. У меня есть и другие способы использования функциональности построения запросов searchAPI, помимо моего typeahead, поэтому я хотел сделать сборщик/исполнитель запросов отдельной вещью.
2) Мне нужна помощь в тестировании этого сервиса typeAhead. Для модульных тестов, как я могу гарантировать, что 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 не предупреждается, поэтому мое обещание не должно быть разрешено или что-то в этом роде...