Используя AngularJS, я пытаюсь протестировать функцию, которая выполняет несколько вызовов $http.
Мой тест выглядит примерно так:
it('traverses over a hierarchical structure over multiple chained calls', function() {
myService.traverseTheStuff()
.then(function(theAggregateResult) {
// ...is never fulfilled
});
$httpBackend.flush();
});
Другие тесты с одиночным вызовом регистрируют обратный вызов, переданный в .then(), и выполняют его, как только я вызываю .flush().
Тестируемый код выглядит примерно так.
function traverseTheStuff(){
// This will make a call to $http to fetch some data
return getRootData()
// It is fulfilled at the end of the test when I $httpBackend.flush()
.then(function(rootData){
// Another call to $http happens AFTER $httpBackend.flush()
return getNextLevel(rootData.someReference);
})
// The second promise is never fulfilled and the test fails
.then(function(nextLevel){
return aggregateTheStuff(...);
});
}
Как бы то ни было, каждый из отдельных вызовов тестируется отдельно. Здесь я хочу пройтись по дереву, агрегировать некоторые данные и модульно протестировать: а) что цепочка обещаний подключена правильно и б) агрегация точна. Сведение его в отдельные дискретные вызовы уже сделано.