Улучшить эту документацию Просмотреть исходный код $httpBackend
- Сервис в модуле ngMock
Реализация фейкового HTTP-бекенда, подходящая для тестирования приложений, использующих сервис $http.
Во время тестирования мы хотим, чтобы наши тесты выполнялись быстро и не зависели от внешних факторов, поэтому мы не хотим отправлять запросы XHR или JSONP на реальный сервер. Всё, что нам действительно нужно, это проверить, был ли отправлен определённый запрос, или же просто позволить приложению сделать запросы, ответить предварительно обученными ответами и утвердить, что конечный результат соответствует ожидаемому.
Эта модель может быть использована для ответа статическими или динамическими ответами через API expect и when и их сокращения (expectGET, whenPOST, и т. д.).
Когда Angular-приложение нуждается в данных с сервера, оно вызывает сервис $http, который отправляет запрос на реальный сервер с помощью сервиса $httpBackend. С помощью инъекции зависимостей легко инжектировать модель $httpBackend (у которой тот же API, что и $httpBackend) и использовать её для проверки запросов и ответа данными для тестирования без отправки запроса на реальный сервер.
Существует два способа указать, какие данные для тестирования должны возвращаться как ответы http от модели бекенда, когда код, подлежащий тестированию, делает запросы http:
-
$httpBackend.expect- определяет ожидание запроса -
$httpBackend.when- определяет определение бекенда
Ожидания запросов против определений бекенда
Ожидания запросов предоставляют способ утверждения о запросах, сделанных приложением, и определения ответов на эти запросы. Тест провалится, если ожидаемые запросы не будут сделаны или сделаны в неправильном порядке.
Определения бекенда позволяют определить фейковый бекенд для вашего приложения, который не утверждает, был ли сделан конкретный запрос, а просто возвращает обученный ответ, если запрос сделан. Тест пройдёт независимо от того, был ли запрос сделан во время тестирования.
| Ожидания запросов | Определения бекенда | |
|---|---|---|
| Синтаксис | .expect(...).respond(...) | .when(...).respond(...) |
| Типичное использование | строгие тесты модулей | слабые (чёрного ящика) тесты модулей |
| Выполнение нескольких запросов | НЕТ | ДА |
| Порядок запросов важен | ДА | НЕТ |
| Запрос обязателен | ДА | НЕТ |
| Ответ обязателен | необязательно (см. ниже) | ДА |
В случаях, когда и определения бекенда, и ожидания запросов указаны во время тестирования модулей, ожидания запросов обрабатываются в первую очередь.
Если ожидание запроса не имеет определённого ответа, алгоритм ищет соответствующий ответ в определениях бекенда.
Если запрос не соответствует ни одному ожиданию, или если ожидание не определяет ответ, определения бекенда обрабатываются в последовательном порядке, чтобы увидеть, совпадает ли какой-либо из них с запросом. Возвращается ответ от первого совпавшего определения.
Очистка HTTP-запросов
Используемый в производстве $httpBackend всегда отвечает на запросы асинхронно. Если мы сохранили бы это поведение в тестировании модулей, нам пришлось бы создавать асинхронные тесты модулей, которые трудно писать, следить и поддерживать. Но и имитация тестирования не может отвечать синхронно; это изменило бы выполнение кода, подлежащего тестированию. По этой причине имитация $httpBackend имеет метод flush(), который позволяет тесту явно очистить ожидающие запросы. Это сохраняет асинхронный API бекенда, позволяя тесту выполняться синхронно.
Тестирование модулей с mock $httpBackend
Следующий код показывает, как настроить и использовать модель бекенда при тестировании модулей контроллера. Сначала мы создаём контроллер, подлежащий тестированию:
// The module code
angular
.module('MyApp', [])
.controller('MyController', MyController);
// The controller code
function MyController($scope, $http) {
var authToken;
$http.get('/auth.py').then(function(response) {
authToken = response.headers('A-Token');
$scope.user = response.data;
});
$scope.saveMessage = function(message) {
var headers = { 'Authorization': authToken };
$scope.status = 'Saving...';
$http.post('/add-msg.py', message, { headers: headers } ).then(function(response) {
$scope.status = '';
})['catch'](function() {
$scope.status = 'Failed...';
});
};
}
Теперь мы настраиваем модель бекенда и создаём тесты:
// testing controller
describe('MyController', function() {
var $httpBackend, $rootScope, createController, authRequestHandler;
// Set up the module
beforeEach(module('MyApp'));
beforeEach(inject(function($injector) {
// Set up the mock http service responses
$httpBackend = $injector.get('$httpBackend');
// backend definition common for all tests
authRequestHandler = $httpBackend.when('GET', '/auth.py')
.respond({userId: 'userX'}, {'A-Token': 'xxx'});
// Get hold of a scope (i.e. the root scope)
$rootScope = $injector.get('$rootScope');
// The $controller service is used to create instances of controllers
var $controller = $injector.get('$controller');
createController = function() {
return $controller('MyController', {'$scope' : $rootScope });
};
}));
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('should fetch authentication token', function() {
$httpBackend.expectGET('/auth.py');
var controller = createController();
$httpBackend.flush();
});
it('should fail authentication', function() {
// Notice how you can change the response even after it was set
authRequestHandler.respond(401, '');
$httpBackend.expectGET('/auth.py');
var controller = createController();
$httpBackend.flush();
expect($rootScope.status).toBe('Failed...');
});
it('should send msg to server', function() {
var controller = createController();
$httpBackend.flush();
// now you don’t care about the authentication, but
// the controller will still send the request and
// $httpBackend will respond without you having to
// specify the expectation and response for this request
$httpBackend.expectPOST('/add-msg.py', 'message content').respond(201, '');
$rootScope.saveMessage('message content');
expect($rootScope.status).toBe('Saving...');
$httpBackend.flush();
expect($rootScope.status).toBe('');
});
it('should send auth header', function() {
var controller = createController();
$httpBackend.flush();
$httpBackend.expectPOST('/add-msg.py', undefined, function(headers) {
// check if the header was sent, if it wasn't the expectation won't
// match the request and the test will fail
return headers['Authorization'] === 'xxx';
}).respond(201, '');
$rootScope.saveMessage('whatever');
$httpBackend.flush();
});
});
Динамические ответы
Вы определяете ответ на запрос, прицепляя вызов respond() к определению или ожиданию. Если вы передадите обратный вызов в качестве первого параметра для respond(callback), то вы сможете динамически сгенерировать ответ на основе свойств запроса.
Функция callback должна иметь вид function(method, url, data, headers, params).
Параметры запроса
По умолчанию параметры запроса в URL-адресах запроса анализируются в объект params. Таким образом, URL-адрес запроса /list?q=searchstr&orderby=-name установит params в {q: 'searchstr', orderby: '-name'}.
Сопоставление параметров с регулярными выражениями
Если ожидание или определение используют регулярное выражение для сопоставления URL-адреса, вы можете передать массив ключей через аргумент params. Индекс каждого ключа в массиве будет соответствовать индексу группы в регулярном выражении.
Объект params в обратном вызове теперь будет иметь свойства с этими ключами, которые содержат значение соответствующей группы в регулярном выражении.
Это также относится к сокращённым методам when и expect.
$httpBackend.expect('GET', /\/user\/(.+)/, undefined, undefined, ['id'])
.respond(function(method, url, data, headers, params) {
// for requested url of '/user/1234' params is {id: '1234'}
});
$httpBackend.whenPATCH(/\/user\/(.+)\/article\/(.+)/, undefined, undefined, ['user', 'article'])
.respond(function(method, url, data, headers, params) {
// for url of '/user/1234/article/567' params is {user: '1234', article: '567'}
});
Сопоставление запросов маршрутов
Для дополнительного удобства доступны сокращения whenRoute и expectRoute . Эти методы предлагают сопоставление URL-пути с использованием двоеточия, игнорируя строку запроса. Это позволяет выполнять объявления, подобные тому, как настраиваются маршруты приложения с помощью $routeProvider. Поскольку эти методы преобразуют URL-определение в регулярное выражение, порядок объявления важен. В сочетании с анализом параметров запроса можно сделать следующее:
$httpBackend.whenRoute('GET', '/users/:id')
.respond(function(method, url, data, headers, params) {
return [200, MockUserList[Number(params.id)]];
});
$httpBackend.whenRoute('GET', '/users')
.respond(function(method, url, data, headers, params) {
var userList = angular.copy(MockUserList),
defaultSort = 'lastName',
count, pages, isPrevious, isNext;
// paged api response '/v1/users?page=2'
params.page = Number(params.page) || 1;
// query for last names '/v1/users?q=Archer'
if (params.q) {
userList = $filter('filter')({lastName: params.q});
}
pages = Math.ceil(userList.length / pagingLength);
isPrevious = params.page > 1;
isNext = params.page < pages;
return [200, {
count: userList.length,
previous: isPrevious,
next: isNext,
// sort field -> '/v1/users?sortBy=firstName'
results: $filter('orderBy')(userList, params.sortBy || defaultSort)
.splice((params.page - 1) * pagingLength, pagingLength)
}];
});
Методы
-
when(method, url, [data], [headers], [keys]);
Создаёт новое определение бэкэнда.
Параметры
Параметр Тип Подробности method stringМетод HTTP.
url stringRegExpfunction(string)HTTP-URL или функция, которая принимает URL и возвращает true, если URL соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)Тело HTTP-запроса или функция, которая принимает строку данных и возвращает true, если данные соответствуют ожидаемым.
headers (необязательно)Objectfunction(Object)HTTP-заголовки или функция, которая принимает объект заголовков и возвращает true, если заголовки соответствуют текущему определению.
keys (необязательно)ArrayМассив ключей для присвоения совпадениям с регулярными выражениями в URL-адресе запроса, описанном выше.
Возвращает
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса.- respond –
{function([status,] data[, headers, statusText]) | function(function(method, url, data, headers, params)}– Метод respond принимает набор статических данных для возврата или функцию, которая может вернуть массив, содержащий код ответа (число), данные ответа (массив|объект|строка), заголовки ответа (объект) и текст для кода состояния (строка). Метод respond возвращает объектrequestHandlerдля возможных перезаписей.
- respond –
-
whenGET(url, [headers], [keys]);
Создаёт новое определение бэкэнда для запросов GET. Для получения дополнительной информации см.
when().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-URL или функция, которая принимает URL и возвращает true, если URL соответствует текущему определению.
headers (необязательно)Objectfunction(Object)HTTP-заголовки.
keys (необязательно)ArrayМассив ключей для присвоения совпадениям с регулярными выражениями в URL-адресе запроса, описанном выше.
Возвращает
requestHandlerВозвращает объект с методом
respondдля управления обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса. -
whenHEAD(url, [headers], [keys]);
Создаёт новое определение бэкэнда для запросов HEAD. Для получения дополнительной информации см.
when().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-URL или функция, которая принимает URL и возвращает true, если URL соответствует текущему определению.
headers (необязательно)Objectfunction(Object)HTTP-заголовки.
keys (необязательно)ArrayМассив ключей для присвоения совпадениям с регулярными выражениями в URL-адресе запроса, описанном выше.
Возвращает
requestHandlerВозвращает объект с методом
respondдля управления обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса. -
whenDELETE(url, [headers], [keys]);
Создаёт новое определение бэкэнда для запросов DELETE. Для получения дополнительной информации см.
when().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-URL или функция, которая принимает URL и возвращает true, если URL соответствует текущему определению.
headers (необязательно)Objectfunction(Object)HTTP-заголовки.
keys (необязательно)ArrayМассив ключей для присвоения совпадениям с регулярными выражениями в URL-адресе запроса, описанном выше.
Возвращает
requestHandlerВозвращает объект с методом
respondдля управления обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса. -
whenPOST(url, [data], [headers], [keys]);
Создаёт новое определение бэкэнда для запросов POST. Для получения дополнительной информации см.
when().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-URL или функция, которая принимает URL и возвращает true, если URL соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)Тело HTTP-запроса или функция, которая принимает строку данных и возвращает true, если данные соответствуют ожидаемым.
headers (необязательно)Objectfunction(Object)HTTP-заголовки.
keys (необязательно)ArrayМассив ключей для присвоения совпадениям с регулярными выражениями в URL-адресе запроса, описанном выше.
Возвращает
requestHandlerВозвращает объект с методом
respondдля управления обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса. -
whenPUT(url, [data], [headers], [keys]);
Создаёт новое определение бэкэнда для запросов PUT. Для получения дополнительной информации см.
when().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-URL или функция, которая принимает URL и возвращает true, если URL соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)Тело HTTP-запроса или функция, которая принимает строку данных и возвращает true, если данные соответствуют ожидаемым.
headers (необязательно)Objectfunction(Object)HTTP-заголовки.
keys (необязательно)ArrayМассив ключей для присвоения совпадениям с регулярными выражениями в URL-адресе запроса, описанном выше.
Возвращает
requestHandlerВозвращает объект с методом
respondдля управления обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса. -
whenJSONP(url, [keys]);
Создаёт новое определение бэкэнда для запросов JSONP. Для получения дополнительной информации см.
when().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-URL или функция, которая принимает URL и возвращает true, если URL соответствует текущему определению.
keys (необязательно)ArrayМассив ключей для присвоения совпадениям с регулярными выражениями в URL-адресе запроса, описанном выше.
Возвращает
requestHandlerВозвращает объект с методом
respondдля управления обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса. -
whenRoute(method, url);
Создаёт новое определение бэкэнда, которое сравнивает только с запрошенным маршрутом.
Параметры
Параметр Тип Подробности method stringМетод HTTP.
url stringСтрока HTTP-URL, которая поддерживает сопоставление параметров с двоеточием.
Возвращает
requestHandlerВозвращает объект с методом
respondдля управления обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса. Подробнее см. #when.
-
expect(method, url, [data], [headers], [keys]);
Создает новое ожидание запроса.
Параметры
Параметр Тип Подробности method stringHTTP-метод.
url stringRegExpfunction(string)HTTP-URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)ObjectТело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожидаемым, или объект, если тело запроса в формате JSON.
headers (необязательно)Objectfunction(Object)HTTP-заголовки или функция, которая получает объект HTTP-заголовков и возвращает true, если заголовки соответствуют текущему ожиданию.
keys (необязательно)ArrayМассив ключей, которые будут назначены совпадениям в регулярных выражениях в адресной строке запроса, описанной выше.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса.- respond –
{ function([status,] data[, headers, statusText]) | function(function(method, url, data, headers, params)}– Метод respond принимает набор статических данных для возврата или функцию, которая может вернуть массив, содержащий код состояния ответа (число), данные ответа (массив/объект/строка), заголовки ответа (объект) и текст для статуса (строка). Метод respond возвращает объектrequestHandlerдля возможных перезаписей.
- respond –
-
expectGET(url, [headers], [keys]);
Создает новое ожидание запроса GET. Дополнительная информация в
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
headers (необязательно)ObjectHTTP-заголовки.
keys (необязательно)ArrayМассив ключей, которые будут назначены совпадениям в регулярных выражениях в адресной строке запроса, описанной выше.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса. Дополнительная информация в разделе #expect. -
expectHEAD(url, [headers], [keys]);
Создает новое ожидание запроса HEAD. Дополнительная информация в
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
headers (необязательно)ObjectHTTP-заголовки.
keys (необязательно)ArrayМассив ключей, которые будут назначены совпадениям в регулярных выражениях в адресной строке запроса, описанной выше.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса. -
expectDELETE(url, [headers], [keys]);
Создает новое ожидание запроса DELETE. Дополнительная информация в
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
headers (необязательно)ObjectHTTP-заголовки.
keys (необязательно)ArrayМассив ключей, которые будут назначены совпадениям в регулярных выражениях в адресной строке запроса, описанной выше.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса. -
expectPOST(url, [data], [headers], [keys]);
Создает новое ожидание запроса POST. Дополнительная информация в
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)ObjectТело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожидаемым, или объект, если тело запроса в формате JSON.
headers (необязательно)ObjectHTTP-заголовки.
keys (необязательно)ArrayМассив ключей, которые будут назначены совпадениям в регулярных выражениях в адресной строке запроса, описанной выше.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса. -
expectPUT(url, [data], [headers], [keys]);
Создает новое ожидание запроса PUT. Дополнительная информация в
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)ObjectТело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожидаемым, или объект, если тело запроса в формате JSON.
headers (необязательно)ObjectHTTP-заголовки.
keys (необязательно)ArrayМассив ключей, которые будут назначены совпадениям в регулярных выражениях в адресной строке запроса, описанной выше.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса. -
expectPATCH(url, [data], [headers], [keys]);
Создает новое ожидание запроса PATCH. Дополнительная информация в
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)ObjectТело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожидаемым, или объект, если тело запроса в формате JSON.
headers (необязательно)ObjectHTTP-заголовки.
keys (необязательно)ArrayМассив ключей, которые будут назначены совпадениям в регулярных выражениях в адресной строке запроса, описанной выше.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса.
-
expectJSONP(url, [keys]);
Создаёт новое ожидание запроса для JSONP-запросов. Для получения дополнительной информации см.
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
keys (необязательно)ArrayМассив ключей для присвоения совпадениям с регулярными выражениями в URL-адресе запроса, описанном выше.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и повторно вызватьrespondдля изменения способа обработки соответствующего запроса. -
expectRoute(method, url);
Создаёт новое ожидание запроса, которое сравнивает только с запрошенным маршрутом.
Параметры
Параметр Тип Подробности method stringHTTP-метод.
url stringСтрока HTTP-URL, поддерживающая сопоставление параметров с двоеточием.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и повторно вызватьrespondдля изменения способа обработки соответствующего запроса. Для получения дополнительной информации см. #expect. -
flush([count], [skip]);
Очищает ожидающие запросы, используя обученные ответы. Запросы очищаются в порядке их поступления, но также можно пропустить один или несколько запросов (например, для их очистки позже). Это полезно для моделирования сценариев, когда ответы приходят с сервера в произвольном порядке.
Если ожидающих запросов для очистки нет, когда вызывается метод, выбрасывается исключение (так как это обычно признак ошибки программирования).
Параметры
Параметр Тип Подробности count (необязательно)numberКоличество ответов для очистки. Если не определено/null, очищаются все ожидающие запросы (начиная после
skip).skip (необязательно)numberКоличество ожидающих запросов для пропуска. Например, значение
5пропустит первые 5 ожидающих запросов и начнёт очистку с 6-го.(по умолчанию: 0)
-
verifyNoOutstandingExpectation();
Проверяет, что все запросы, определённые с помощью API
expect, были выполнены. Если какой-либо из запросов не был выполнен, verifyNoOutstandingExpectation выбрасывает исключение.Обычно этот метод вызывается после каждого тестового случая, который проверяет запросы с помощью клаузы «afterEach».
afterEach($httpBackend.verifyNoOutstandingExpectation);
-
verifyNoOutstandingRequest();
Проверяет, что нет ожидающих запросов, которые требуют очистки.
Обычно этот метод вызывается после каждого тестового случая, который проверяет запросы с помощью клаузы «afterEach».
afterEach($httpBackend.verifyNoOutstandingRequest);
-
resetExpectations();
Сбрасывает все ожидания запросов, но сохраняет все определения бэкенда. Обычно resetExpectations вызывается во время многофазного тестирования, когда вы хотите повторно использовать тот же экземпляр подделки $httpBackend.
© 2010–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.5.11/docs/api/ngMock/service/$httpBackend