Сервис издевательств в AngularJS HTTP

angularjs http mocking jasmine

775 просмотра

2 ответа

Я пытаюсь проверить контроллер, который выполняет http-запрос через службу.

Должен ли я просто издеваться над сервисом и возвращать значение по умолчанию, вместо того, чтобы делать фактический HTTP-запрос или использовать $httpBackend.

Кстати, я тестирую в Жасмин.

Благодарю.

Автор: SwimmingG Источник Размещён: 06.11.2019 05:01

Ответы (2)


0 плюса

TL; DR Не делайте реальный http-запрос.

  • ИСПЫТАНИЯ НА БЛОКИ
    При выполнении правильных юнит-тестов вы тестируете только один юнит. Это может быть класс или только часть класса. Это означает, что вы должны издеваться над зависимостями. В вашем случае это будет означать, что вы будете издеваться над службой, чтобы просто действовать как класс. Так что возвращаем обещание, содержащее модель данных.
    Pro : Самое большое преимущество настоящих юнит-тестов - это скорость. Вы можете выполнить огромное количество модульных тестов вместо одного сквозного теста.
    con : Самый большой недостаток юнит-тестов заключается в том, что когда вы изменяете зависимость для работы по-другому, ваши тесты все равно будут успешными, потому что служба была имитирована.
  • ИНТЕГРАЦИОННЫЕ ИСПЫТАНИЯ
    Интеграционный тест работает почти как юнит-тест, но здесь вы не высмеиваете прямые зависимости. В вашем случае, когда вы проводите интеграционный тест, вы не будете издеваться над сервисом, а скорее над его зависимостями (с $ httpBackend).
    Pro : Все еще довольно быстро, и предлагает еще более надежные тесты. Потому что, когда вы обновляете прямые зависимости, классы, которые вы тестируете, могут потерпеть неудачу, потому что они не являются поддельными.
    con : Не так быстро, как юнит-тест, но все же очень быстро.
  • END-TO-END
    Тесты E2E тестируют все приложение, ничего не дразня. Это включает в себя все XHR-вызовы API.
    "за" : поскольку ничего не высмеивается, оно всегда охватывает все приложение. И это очень полезно для отслеживания DOM-изменений и совместимости браузера. Он может даже автоматически делать скриншоты, чтобы получить реальное представление визуализированных данных.
    против : это медленно. Поскольку он выполняет реальные вызовы API, выполнение этих тестов может занять некоторое время.

Таким образом, чтобы ответить на ваш вопрос, это зависит от того, что вы пишете. Когда вы пишете правильные юнит-тесты, вы должны издеваться над сервисом:

$provide.service('DataService', ['$q', function($q) { 
  this.get = function() {
    return $q(function(resolve, reject) {
      if (requestFailed) {
        reject('The request failed');
      }

      resolve(APIData);
    });
  };
}]);

Если вы выполняете integartion-тесты, вы должны смоделировать фактический $ http-запрос, используя $httpBackend.

it('should request data', function() {
  $httpBackend
    .expect('GET', url)
    .respond(APIData);

  expect($scope.list.count).toEqual(0);

  $scope.clickRetrieve();
  $httpBackend.flush();

  expect($scope.list.count).toBeGreaterThan(0);
});

Я работаю над довольно большим приложением и не имею большого опыта в тестировании. Но мой любимый тип тестирования - это, безусловно, интеграционное тестирование. У меня были некоторые проблемы с юнит-тестами, которые не выявили серьезных изменений из-за поддельных сервисов. Так как я почти переключился на интегрированные тесты, где я почти исключительно высмеиваю свои службы данных.

примечание : я работаю с использованием сервисов данных, которые выступают в качестве слоя между моим приложением и API, если API обновляется, теоретически я должен обновлять только сервис данных, поскольку никакой класс, кроме репозитория, не обращается к ним. Таким образом, я могу гарантировать, что в моем приложении я работаю только с DataModels вместо простых объектов, и что я использую undefined, нет null.

Автор: Pjetr Размещён: 18.07.2016 08:54

0 плюса

использование $httpBackend

Поскольку вы должны высмеивать ответ также

$httpBackend.when("GET",'URL').respond(respnonse);

Ответ содержит значение, которое вы ожидаете.

Автор: Vikash Kumar Размещён: 18.07.2016 08:32
Вопросы из категории :
32x32