Spec-Zone.ru › Angular.js 1.3

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

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

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

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

При тестировании отдельных компонентов мы хотим, чтобы наши тесты выполнялись быстро и не зависели от внешних факторов, поэтому мы не хотим отправлять запросы 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 бэкенда, позволяя тесту выполняться синхронно.

Тестирование отдельных компонентов с имитацией $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 = 'ERROR!';
    });
  };
}

Теперь мы настраиваем имитацию бэкенда и создаем тестовые спецификации:

// 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 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 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 для возможных перезаписей.
  • 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 string

    HTTP-метод.

    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 для возможных перезаписей.
  • expectGET(url, [headers]);

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

    Параметры

    Параметр Тип Подробности
    url stringRegExpfunction(string)

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

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

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

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

    requestHandler

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

  • expectHEAD(url, [headers]);

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

    Параметры

    Параметр Тип Подробности
    url stringRegExpfunction(string)

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

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

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

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

    requestHandler

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

  • expectDELETE(url, [headers]);

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

    Параметры

    Параметр Тип Подробности
    url stringRegExpfunction(string)

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

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

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

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

    requestHandler

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

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

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

    Параметры

    Параметр Тип Подробности
    url stringRegExpfunction(string)

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

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

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

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

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

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

    requestHandler

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

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

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

    Параметры

    Параметр Тип Подробности
    url stringRegExpfunction(string)

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

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

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

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

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

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

    requestHandler

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

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

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

    Параметры

    Параметр Тип Подробности
    url stringRegExpfunction(string)

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

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

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

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

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

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

    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();

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

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

Spec-Zone.ru

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