Модульное тестирование обработчика событий AngularJS $ http с помощью Jasmine / Karma? - PullRequest
0 голосов
/ 02 октября 2018

Я использую AngularJS 1.5.8, и у меня есть фабрика с методом, который возвращает экземпляр запроса $ http.Включает в себя прогресс eventHandler.У меня вопрос, как я могу проверить этот обработчик событий, используя Jasmine / Karma?Обычно запросы проверяются путем их макетирования с помощью $httpBackend.expectPOST или аналогичного, но тогда событие progress никогда не запускается.И если я не высмеиваю это, Карма жалуется на неожиданный запрос.Как мне это сделать?

1 Ответ

0 голосов
/ 16 октября 2018

Я понял это.Способ сделать это - использовать AngularJS-декораторы для расширения $ httpBackend, что позволяет перехватывать вызовы в бэкэнд, регистрировать переданные им обработчики и делегировать исходный объект:

    var httpDecorator = function($delegate) {
    $delegate.eventHandlers = [];
    var newBackend = function() {
      $delegate.eventHandlers.push(arguments[8]);
      return $delegate.apply(null, arguments);
    };
    angular.forEach($delegate, function(value, key) {
      if ($delegate.hasOwnProperty(key)) {
        newBackend[key] = value;
      }
    });
    return newBackend;
  };
  $provide.decorator('$httpBackend', ['$delegate', httpDecorator]);

После настройки в определении module(...) в обратном вызове beforeEach(...) теперь я могу ссылаться на $httpBackend.eventHandlers в своих модульных тестах и ​​получать ссылки на все из них:)

...