Обеспечение сброса $httpBackend для серии запросов

Мне нужно протестировать внутреннюю службу angular, реализованную в Angular 1.5.9 с помощью jasmine/karma.

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

К сожалению, служба выполняет многочисленные вызовы собственных функций, многие из которых выполняют дальнейшие вызовы с использованием службы $http angular. Это делается для того, чтобы заполнить такие объекты, как пользовательские данные, локаль и другую специальную информацию о продукте. Достаточно сказать, что я не в состоянии преобразовать сервис в лучшую архитектуру; Я должен просто построить этот тест.

Поскольку вызовов $http очень много, я намерен имитировать все данные, которые он запросит, используя серию строк, таких как эта:

var mockGetCartData = { "d": null, "message": null }; // at the top of the describe
$httpBackend.when('GET', /(.*)\/order\/api\/v1\/GetCart/).respond(200, mockGetCartData); // in the beforeEach

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

Нужно ли мне это делать или достаточно настроить все записи $httpBackend.when().respond(), воздействовать на тестовую функцию, а затем вызвать одну flush()? Если этого недостаточно, что мне делать?


person Matt W    schedule 04.09.2017    source источник


Ответы (2)


Вам не нужно вызывать flush() для каждого сделанного запроса, так как он сбрасывает все ожидающие запросы.

См. Документацию: https://docs.angularjs.org/api/ngMock/service/$httpBackend

или источник: https://github.com/angular/angular.js/blob/master/src/ngMock/angular-mocks.js#L1830

Однако, если $http запросов в тестируемом методе объединены в цепочку (поэтому последующие запросы выполняются только после разрешения предыдущего запроса), вам потребуется flush() для каждого запроса в цепочке. Не видя тестируемого кода, это вся помощь, которую я могу дать.

person Michael Nelson    schedule 06.09.2017

Вы должны издеваться над единственным требуемым http-вызовом в блоке It и сбрасывать его после вызова функции. В противном случае он попытается сбросить неожиданные http-вызовы, что приведет к ошибке.

person Ankit Shah    schedule 06.09.2017