Spec-Zone.ru › Angular.js 1.2

Улучшить эту документацию Посмотреть исходный код $httpBackend

  1. Сервис в модуле ngMock

Имитация HTTP-бекенда, подходящая для тестирования приложений, использующих сервис $http.

Примечание: Для имитации HTTP-бекенда, подходящей для end-to-end тестирования или разработки без бэкенда, см. модель e2e $httpBackend.

При тестировании мы хотим, чтобы наши тесты выполнялись быстро и без внешних зависимостей, поэтому не нужно отправлять запросы XHR или JSONP на реальный сервер. Нам нужно только проверить, был ли отправлен определённый запрос, или же просто позволить приложению отправлять запросы, отвечать предварительно подготовленными ответами и утверждать, что конечный результат соответствует ожидаемому.

Эта имитация может использоваться для ответа с помощью статических или динамических ответов через expect и when API и их сокращения (expectGET, whenPOST, и т.д.).

Когда приложению Angular требуется данные с сервера, оно вызывает сервис $http, который отправляет запрос на реальный сервер, используя сервис $httpBackend. С помощью инъекции зависимостей легко ввести имитацию $httpBackend (которая имеет тот же API, что и $httpBackend) и использовать её для проверки запросов и ответа данными для тестирования, не отправляя запрос на реальный сервер.

Существует два способа указать, какие данные для тестирования должны возвращаться как ответы http мок-бекендом, когда код, который тестируется, делает запросы http:

  • $httpBackend.expect - определяет ожидание запроса
  • $httpBackend.when - определяет определение бэкенда

Ожидания запросов против определений бэкенда

Ожидания запросов позволяют делать утверждения о запросах, выполняемых приложением, и определять ответы на эти запросы. Тест завершится ошибкой, если ожидаемые запросы не будут выполнены или будут выполнены в неправильном порядке.

Определения бэкенда позволяют определить фиктивный бэкенд для вашего приложения, который не проверяет, был ли выполнен конкретный запрос или нет, он просто возвращает обученный ответ, если запрос выполнен. Тест пройдёт, независимо от того, был ли выполнен запрос во время тестирования.

Ожидания запросов Определения бэкенда
Синтаксис .expect(...).respond(...) .when(...).respond(...)
Типичное использование строгие unit-тесты свободные (black-box) unit-тесты
Выполнение нескольких запросов НЕТ ДА
Порядок запросов важен ДА НЕТ
Запрос обязателен ДА НЕТ
Ответ обязателен необязательно (см. ниже) ДА

В случаях, когда и определения бэкенда, и ожидания запросов указаны во время unit-тестирования, сначала оцениваются ожидания запросов.

Если для ожидания запроса не задан ответ, алгоритм будет искать соответствующий ответ в определениях бэкенда.

Если запрос не совпал ни с одним ожиданием, или ожидание не имеет определённого ответа, определения бэкенда оцениваются последовательно, чтобы проверить, соответствует ли какой-либо запрос. Ответ от первого соответствующего определения возвращается.

Очистка HTTP-запросов

Сервис $httpBackend, используемый в производстве, всегда отвечает на запросы асинхронно. Если мы сохранили бы это поведение при unit-тестировании, нам пришлось бы создавать асинхронные unit-тесты, которые трудно писать, отслеживать и поддерживать. Но и имитация тестирования не может отвечать синхронно; это изменило бы выполнение кода, который тестируется. По этой причине имитация $httpBackend имеет метод flush(), который позволяет тесту явно очистить ожидающие запросы. Это сохраняет асинхронный API бэкенда, позволяя тесту выполняться синхронно.

Unit-тестирование с mock $httpBackend

Следующий код показывает, как настроить и использовать mock-бэкенд при unit-тестировании контроллера. Сначала создаём контроллер, который нужно протестировать:

// 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 = 'ERROR!';
    });
  };
}

Теперь мы настраиваем mock-бэкенд и создаём тест:

// testing controller
describe('MyController', function() {
   var $httpBackend, $rootScope, createController;

   beforeEach(inject(function($injector) {
     // Set up the mock http service responses
     $httpBackend = $injector.get('$httpBackend');
     // backend definition common for all tests
     $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 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 send, 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 string

    Метод HTTP.

    url stringRegExp

    HTTP URL.

    data
    (необязательно)
    stringRegExpfunction(string)

    Тело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожиданиям.

    headers
    (необязательно)
    Objectfunction(Object)

    HTTP-заголовки или функция, которая получает объект заголовков HTTP и возвращает true, если заголовки соответствуют текущему определению.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой совпадающего запроса.

    • respond – {function([status,] data[, headers, statusText]) | function(function(method, url, data, headers)} – Метод respond принимает набор статических данных для возврата или функцию, которая может вернуть массив, содержащий код состояния ответа (число), данные ответа (строка), заголовки ответа (объект) и текст для кода состояния (строка).
  • whenGET(url, [headers]);

    Создает новое определение бэкенда для запросов GET. Для получения дополнительной информации см. when().

    Параметры

    Параметр Тип Описание
    url stringRegExp

    HTTP URL.

    headers
    (необязательно)
    Objectfunction(Object)

    HTTP-заголовки.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой совпадающего запроса.

  • whenHEAD(url, [headers]);

    Создает новое определение бэкенда для запросов HEAD. Для получения дополнительной информации см. when().

    Параметры

    Параметр Тип Описание
    url stringRegExp

    HTTP URL.

    headers
    (необязательно)
    Objectfunction(Object)

    HTTP-заголовки.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой совпадающего запроса.

  • whenDELETE(url, [headers]);

    Создает новое определение бэкенда для запросов DELETE. Для получения дополнительной информации см. when().

    Параметры

    Параметр Тип Описание
    url stringRegExp

    HTTP URL.

    headers
    (необязательно)
    Objectfunction(Object)

    HTTP-заголовки.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой совпадающего запроса.

  • whenPOST(url, [data], [headers]);

    Создает новое определение бэкенда для запросов POST. Для получения дополнительной информации см. when().

    Параметры

    Параметр Тип Описание
    url stringRegExp

    HTTP URL.

    data
    (необязательно)
    stringRegExpfunction(string)

    Тело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожиданиям.

    headers
    (необязательно)
    Objectfunction(Object)

    HTTP-заголовки.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой совпадающего запроса.

  • whenPUT(url, [data], [headers]);

    Создает новое определение бэкенда для запросов PUT. Для получения дополнительной информации см. when().

    Параметры

    Параметр Тип Описание
    url stringRegExp

    HTTP URL.

    data
    (необязательно)
    stringRegExpfunction(string)

    Тело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожиданиям.

    headers
    (необязательно)
    Objectfunction(Object)

    HTTP-заголовки.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой совпадающего запроса.

  • whenPATCH(url, [data], [headers]);

    Создает новое определение бэкенда для запросов PATCH. Для получения дополнительной информации см. when().

    Параметры

    Параметр Тип Описание
    url stringRegExp

    HTTP URL.

    data
    (необязательно)
    stringRegExpfunction(string)

    Тело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожиданиям.

    headers
    (необязательно)
    Objectfunction(Object)

    HTTP-заголовки.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой совпадающего запроса.

  • whenJSONP(url);

    Создает новое определение бэкенда для запросов JSONP. Для получения дополнительной информации см. when().

    Параметры

    Параметр Тип Описание
    url stringRegExp

    HTTP URL.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой совпадающего запроса.

  • expect(method, url, [data], [headers]);

    Создает новое ожидание запроса.

    Параметры

    Параметр Тип Описание
    method string

    Метод HTTP.

    url stringRegExp

    HTTP URL.

    data
    (необязательно)
    stringRegExpfunction(string)Object

    Тело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожиданиям, или объект, если тело запроса в формате JSON.

    headers
    (необязательно)
    Objectfunction(Object)

    HTTP-заголовки или функция, которая получает объект заголовков HTTP и возвращает true, если заголовки соответствуют текущему ожиданию.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой совпадающего запроса.

    • respond – {function([status,] data[, headers, statusText]) | function(function(method, url, data, headers)} – Метод respond принимает набор статических данных для возврата или функцию, которая может вернуть массив, содержащий код состояния ответа (число), данные ответа (строка), заголовки ответа (объект) и текст для кода состояния (строка).
  • expectGET(url, [headers]);

    Создает новое ожидание запроса GET. Для получения дополнительной информации см. expect().

    Параметры

    Параметр Тип Описание
    url stringRegExp

    HTTP URL.

    headers
    (необязательно)
    Object

    HTTP-заголовки.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond , который управляет обработкой совпадающего запроса. Для получения дополнительной информации см. #expect.

  • expectHEAD(url, [headers]);

    Создает новое ожидание запроса HEAD. Для получения дополнительной информации см. expect().

    Параметры

    Параметр Тип Описание
    url stringRegExp

    HTTP URL.

    headers
    (необязательно)
    Object

    HTTP-заголовки.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond , который управляет обработкой совпадающего запроса.

  • expectDELETE(url, [headers]);

    Создаёт ожидание запроса DELETE. Для получения дополнительной информации см. expect().

    Параметры

    Параметр Тип Подробности
    url stringRegExp

    HTTP-url.

    headers
    (необязательно)
    Object

    HTTP-заголовки.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой соответствующего запроса.

  • expectPOST(url, [data], [headers]);

    Создаёт ожидание запроса POST. Для получения дополнительной информации см. expect().

    Параметры

    Параметр Тип Подробности
    url stringRegExp

    HTTP-url.

    data
    (необязательно)
    stringRegExpfunction(string)Object

    Тело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожиданиям, или объект, если тело запроса в формате JSON.

    headers
    (необязательно)
    Object

    HTTP-заголовки.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой соответствующего запроса.

  • expectPUT(url, [data], [headers]);

    Создаёт ожидание запроса PUT. Для получения дополнительной информации см. expect().

    Параметры

    Параметр Тип Подробности
    url stringRegExp

    HTTP-url.

    data
    (необязательно)
    stringRegExpfunction(string)Object

    Тело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожиданиям, или объект, если тело запроса в формате JSON.

    headers
    (необязательно)
    Object

    HTTP-заголовки.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой соответствующего запроса.

  • expectPATCH(url, [data], [headers]);

    Создаёт ожидание запроса PATCH. Для получения дополнительной информации см. expect().

    Параметры

    Параметр Тип Подробности
    url stringRegExp

    HTTP-url.

    data
    (необязательно)
    stringRegExpfunction(string)Object

    Тело HTTP-запроса или функция, которая получает строку данных и возвращает true, если данные соответствуют ожиданиям, или объект, если тело запроса в формате JSON.

    headers
    (необязательно)
    Object

    HTTP-заголовки.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой соответствующего запроса.

  • expectJSONP(url);

    Создаёт ожидание запроса JSONP. Для получения дополнительной информации см. expect().

    Параметры

    Параметр Тип Подробности
    url stringRegExp

    HTTP-url.

    Возвращаемое значение

    requestHandler

    Возвращает объект с методом respond, который управляет обработкой соответствующего запроса.

  • flush([count]);

    Очищает все ожидающие запросы, используя обученные ответы.

    Параметры

    Параметр Тип Подробности
    count
    (необязательно)
    number

    Количество ответов для очистки (в порядке их поступления). Если не определено, будут очищены все ожидающие запросы. Если ожидающих запросов нет, при вызове метода flush будет выброшено исключение (так как это обычно указывает на ошибку в программировании).

  • verifyNoOutstandingExpectation();

    Проверяет, что все запросы, определённые с помощью API expect, были выполнены. Если какой-либо запрос не был выполнен, verifyNoOutstandingExpectation выбросит исключение.

    Обычно этот метод вызывается после каждого тестового случая, проверяющего запросы, используя клаузу "afterEach".

    afterEach($httpBackend.verifyNoOutstandingExpectation);
    
  • verifyNoOutstandingRequest();

    Проверяет, что нет ожидающих запросов, которые необходимо очистить.

    Обычно этот метод вызывается после каждого тестового случая, проверяющего запросы, используя клаузу "afterEach".

    afterEach($httpBackend.verifyNoOutstandingRequest);
    
  • resetExpectations();

    Сбрасывает все ожидания запросов, но сохраняет все определения бэкенда. Обычно resetExpectations вызывается во время многофазного теста, когда необходимо повторно использовать тот же экземпляр $httpBackend mock.

© 2010–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.2.32/docs/api/ngMock/service/$httpBackend

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API