Mocking $httpBackend - как обращаться с "Неожиданным запросом, больше запросов не требуется"?
У меня есть тест Жасмин, который закодирован следующим образом:
it ("should send correct message to server to get data, and correctly set up scope when receiving it", function(){
$httpBackend.when('GET', 'https://localhost:44300/api/projectconfiguration/12').respond(fakedDtoBase);
$routeParams.projectId=fakeId; // user asks for editing project
scope.$apply(function(){
var controller=controllerToTest(); // so controller gets data when it is created
});
expect(scope.projectData).toEqual(fakedDtoBase);
});
и это вроде работает, но я получаю ошибку:
Error: Unexpected request: GET views/core/main/main.html
No more request expected
at $httpBackend (C:/SVN/src/ClientApp/client/bower_components/angular-mocks/angular-mocks.js:1207:9)
at sendReq (C:/SVN/src/ClientApp/client/bower_components/angular/angular.js:7800:9)
at $http.serverRequest (C:/SVN/src/ClientApp/client/bower_components/angular/angular.js:7534:16)
(more stack trace)....
Я понимаю, что я могу издеваться над каждым другим вызовом. Но позвольте сказать, что меня не волнует, что еще мой тест хочет загрузить, поскольку это может назвать несколько других вещей.
Как я могу убедиться, что все остальные запросы просто "происходят беззвучно", возможно, предлагают один фиктивный ответ для всего остального?
Ответы
Ответ 1
Тестовый тест завершился неудачно, потому что был сделан запрос, который вы не указали.
Попробуйте добавить:
$httpBackend.when('GET', 'views/core/main/main.html').respond(fakedMainResponse);
Конечно, вы также должны определить fakedMainResponse
.
Обратите внимание также на документацию (раздел "Запросы на ожидании" и "Определение бэкэнда" ), в котором говорится:
Запрос ожиданий обеспечивает способ сделать утверждения о запросах сделанные приложением, и для определения ответов на эти запросы. Тест не будет выполнен, если ожидаемые запросы не будут выполнены или они сделано в неправильном порядке.
Второй параметр $httpBackend.when
на самом деле a RegExp
. Поэтому, если вы предоставите RegExp
, который будет соответствовать всем другим запросам, он должен работать.
Ответ 2
Для тех, кто использует httpBackend для подделки http-вызовов в тестах EndToEnd или просто издевательства над всеми HTTP-вызовами для приложения, необходимо добавить следующий код в разделе конфигурации приложения (измените регулярное выражение в соответствии с вашим расположением шаблона):
$httpBackend.whenGET(/^\/templates\//).passThrough();
Ссылка: https://docs.angularjs.org/api/ngMockE2E/service/ $httpBackend
Протестировано с угловыми 1,4 для исправления аналогичной проблемы при интегрировании ui-router