Улучшить эту документациюПросмотреть исходный код$httpBackend
- Сервис в модуле ngMock
Реализация поддельного HTTP-бекенда, подходящая для тестирования приложений, использующих сервис $http.
Примечание: Для реализации поддельного HTTP-бекенда, подходящей для end-to-end тестирования или разработки без бэкенда, см. модель e2e $httpBackend.
Во время тестирования модулей мы хотим, чтобы наши тесты выполнялись быстро и не зависели от внешних зависимостей, поэтому мы не хотим отправлять запросы XHR или JSONP на реальный сервер. Нам нужно только проверить, был ли отправлен определенный запрос, или же просто позволить приложению делать запросы, отвечать предварительно обученными ответами и утверждать, что конечный результат соответствует ожидаемому.
Данная модель может использоваться для ответа статическими или динамическими ответами через APIs 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 бэкенда, при этом позволяя тесту выполняться синхронно.
Тестирование модулей с помощью поддельного $httpBackend
Следующий код демонстрирует, как настроить и использовать поддельный бэкенд при тестировании модуля контроллера. Сначала мы создаём контроллер под тестированием:
// The module code
angular
.module('MyApp', [])
.controller('MyController', MyController);
// The controller code
function MyController($scope, $http) {
var authToken;
$http.get('/auth.py').success(function(data, status, headers) {
authToken = headers('A-Token');
$scope.user = data;
});
$scope.saveMessage = function(message) {
var headers = { 'Authorization': authToken };
$scope.status = 'Saving...';
$http.post('/add-msg.py', message, { headers: headers } ).success(function(response) {
$scope.status = '';
}).error(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();
});
});
Методы
-
when(method, url, [data], [headers]);
Создаёт новое определение бэкенда.
Параметры
Параметр Тип Подробности method stringHTTP метод.
url stringRegExpfunction(string)HTTP URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)Тело HTTP запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожиданиям.
headers (необязательно)Objectfunction(Object)HTTP заголовки или функция, которая получает объект HTTP заголовка и возвращает true, если заголовки соответствуют текущему определению.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса.- respond –
{function([status,] data[, headers, statusText]) | function(function(method, url, data, headers)}– Метод respond принимает набор статических данных для возврата или функцию, которая может вернуть массив, содержащий код ответа (число), данные ответа (строка), заголовки ответа (объект) и текст для кода статуса (строка). Метод respond возвращает объектrequestHandlerдля возможных переопределений.
- respond –
-
whenGET(url, [headers]);
Создаёт новое определение бэкенда для GET-запросов. Для более подробной информации см.
when().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
headers (необязательно)Objectfunction(Object)HTTP заголовки.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса. -
whenHEAD(url, [headers]);
Создаёт новое определение бэкенда для HEAD-запросов. Для более подробной информации см.
when().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
headers (необязательно)Objectfunction(Object)HTTP заголовки.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса. -
whenDELETE(url, [headers]);
Создаёт новое определение бэкенда для DELETE-запросов. Для более подробной информации см.
when().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
headers (необязательно)Objectfunction(Object)HTTP заголовки.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса. -
whenPOST(url, [data], [headers]);
Создаёт новое определение бэкенда для POST-запросов. Для более подробной информации см.
when().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)Тело HTTP запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожиданиям.
headers (необязательно)Objectfunction(Object)HTTP заголовки.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса. -
whenPUT(url, [data], [headers]);
Создаёт новое определение бэкенда для PUT-запросов. Для более подробной информации см.
when().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)Тело HTTP запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожиданиям.
headers (необязательно)Objectfunction(Object)HTTP заголовки.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса. -
whenJSONP(url);
Создаёт новое определение бэкенда для JSONP-запросов. Для более подробной информации см.
when().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса. -
expect(method, url, [data], [headers]);
Создаёт новое ожидание запроса.
Параметры
Параметр Тип Подробности method stringHTTP метод.
url stringRegExpfunction(string)HTTP URL или функция, которая получает URL и возвращает true, если URL соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)ObjectТело HTTP запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожиданиям, или объект, если тело запроса в формате JSON.
headers (необязательно)Objectfunction(Object)HTTP заголовки или функция, которая получает объект http-заголовка и возвращает true, если заголовки соответствуют текущему ожиданию.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для последующего использования и вызватьrespondснова, чтобы изменить способ обработки соответствующего запроса.- respond –
{function([status,] data[, headers, statusText]) | function(function(method, url, data, headers)}– Метод respond принимает набор статических данных для возврата или функцию, которая может вернуть массив, содержащий код ответа (число), данные ответа (строка), заголовки ответа (объект) и текст для кода статуса (строка). Метод respond возвращает объектrequestHandlerдля возможных переопределений.
- respond –
-
expectGET(url, [headers]);
Создает новое ожидание запроса для GET-запросов. Дополнительную информацию см. в
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-адрес или функция, которая получает адрес и возвращает true, если адрес соответствует текущему определению.
headers (необязательно)ObjectHTTP-заголовки.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для дальнейшего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса. См. #expect для получения дополнительной информации. -
expectHEAD(url, [headers]);
Создает новое ожидание запроса для HEAD-запросов. Дополнительную информацию см. в
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-адрес или функция, которая получает адрес и возвращает true, если адрес соответствует текущему определению.
headers (необязательно)ObjectHTTP-заголовки.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для дальнейшего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса. -
expectDELETE(url, [headers]);
Создает новое ожидание запроса для DELETE-запросов. Дополнительную информацию см. в
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-адрес или функция, которая получает адрес и возвращает true, если адрес соответствует текущему определению.
headers (необязательно)ObjectHTTP-заголовки.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для дальнейшего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса. -
expectPOST(url, [data], [headers]);
Создает новое ожидание запроса для POST-запросов. Дополнительную информацию см. в
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-адрес или функция, которая получает адрес и возвращает true, если адрес соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)ObjectТело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожидаемым, или объект, если тело запроса в формате JSON.
headers (необязательно)ObjectHTTP-заголовки.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для дальнейшего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса. -
expectPUT(url, [data], [headers]);
Создает новое ожидание запроса для PUT-запросов. Дополнительную информацию см. в
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-адрес или функция, которая получает адрес и возвращает true, если адрес соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)ObjectТело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожидаемым, или объект, если тело запроса в формате JSON.
headers (необязательно)ObjectHTTP-заголовки.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для дальнейшего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса. -
expectPATCH(url, [data], [headers]);
Создает новое ожидание запроса для PATCH-запросов. Дополнительную информацию см. в
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-адрес или функция, которая получает адрес и возвращает true, если адрес соответствует текущему определению.
data (необязательно)stringRegExpfunction(string)ObjectТело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожидаемым, или объект, если тело запроса в формате JSON.
headers (необязательно)ObjectHTTP-заголовки.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для дальнейшего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса. -
expectJSONP(url);
Создает новое ожидание запроса для JSONP-запросов. Дополнительную информацию см. в
expect().Параметры
Параметр Тип Подробности url stringRegExpfunction(string)HTTP-адрес или функция, которая получает адрес и возвращает true, если адрес соответствует текущему определению.
Возвращаемое значение
requestHandlerВозвращает объект с методом
respond, который управляет обработкой соответствующего запроса. Вы можете сохранить этот объект для дальнейшего использования и вызватьrespondснова, чтобы изменить обработку соответствующего запроса. -
flush([count]);
Очищает все ожидающие запросы с использованием обученных ответов.
Параметры
Параметр Тип Подробности count (необязательно)numberКоличество ответов для очистки (в порядке их прибытия). Если не определено, все ожидающие запросы будут очищены. Если ожидающих запросов нет, когда вызывается метод flush, генерируется исключение (так как это обычно свидетельствует об ошибке программирования).
-
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.4.14/docs/api/ngMock/service/$httpBackend