#angularjs
#angularjs
Вопрос:
Я хотел бы перехватывать все $http
вызовы, выполняемые различными службами, и возвращать объект, который объявлен внутри перехватчика, также известного как жестко закодированные данные.
Средство перехвата запросов, предоставляемое Angular, похоже, способно изменять и возвращать только объект HTTP config.
Как я могу манипулировать возвращаемыми данными, фактически не вызывая сервер?
Спасибо.
Комментарии:
1. Вы смотрели на docs.angularjs.org/api/ngMockE2E/service /$httpBackend ? Кроме того, линейщик linemanjs.com имеет опцию заглушки API, которая могла бы достичь чего-то подобного
2. Я не пытаюсь это тестировать. Это для другой цели.
3. Можно
$httpBackend
включать и выключать во время выполнения?4. вы можете просто удалить модуль, который включает в себя $ httpBackend из вашей сборки во время выполнения, и тогда все http-запросы $ будут обрабатываться нормально
5. Интересно. Итак, я пытаюсь выполнить AJAX-вызовы на сервер — работает. Однако после переключения переключателя я хочу, чтобы все эти вызовы возвращали жестко закодированные данные из центральной позиции, такой как HTTP-перехватчик, без фактического выполнения вызова. Может ли $ httpBackend это сделать? Можете ли вы показать мне, как, потому что я не могу найти, как это будет работать.
Ответ №1:
Чтобы использовать $ httpBackend из MockE2E для предоставления ложных ответов API либо в целях тестирования, либо для предоставления ложного API для разработки клиента, если серверный API недоступен, сначала вам необходимо включить angular-mocks.js поскольку это содержит ngMockE2E.
Затем вам нужно добавить модуль, что-то вроде:
angular.module('mockBackend', [ 'ngMockE2E'])
.run(function($httpBackend) {
phones = [{name: 'phone1'}, {name: 'phone2'}];
// returns the current list of phones
$httpBackend.whenGET('/phones').respond(phones);
// adds a new phone to the phones array
$httpBackend.whenPOST('/phones').respond(function(method, url, data) {
var phone = angular.fromJson(data);
phones.push(phone);
return [200, phone, {}];
});
$httpBackend.whenGET(/^/templates//).passThrough();
//...
});
Приведенное выше взято из документов по адресуhttps://docs.angularjs.org/api/ngMockE2E/service /$httpBackend — вам нужно будет настроить здесь все конечные точки вашего API, для которых вы хотите возвращать фиктивные данные, наряду с любыми, для которых вам нужны реальные данные, например. в приведенных выше любых запросах для ‘templates’ используется .passThrough, чтобы по-прежнему пересылать эти запросы на сервер, но возвращает фиктивные данные для вызовов API в ‘/phones’.
Что касается того, как это отключить и включить, это будет зависеть от того, как у вас настроен процесс сборки angular. Если вы не хотите ничего из этого в своей рабочей версии, вы могли бы поместить вышеуказанное в отдельный mockbackend.js файл и добавить
angular.module('myApp').requires.push('mockBackend');
в нижнюю часть файла, где «MyApp» будет вашим модулем приложения. Затем в процессе сборки (ручной или автоматизированной) для ваших производственных файлов вы можете удалить angular-mocks.js и mockbackend.js требуется от вашего index.html файл и все ваши вызовы api вернутся к вызову сервера.
Если вы хотите изменить, используется ли макет серверной части или нет во время разработки, вы могли бы передать константу в модуль mockBackend и использовать это, чтобы решить, возвращаются ли реальные или фиктивные данные, например. если у вас есть константа ‘DEV’, которая является простым логическим:
if (DEV === true) {
$httpBackend.whenGET('/phones').respond(phones);
} else {
$httpBackend.whenGET(/phones).passThrough();
}