Как я могу сделать $httpBackend нечувствительным к порядку параметров URL-запроса?
Я использую Angular.js $httpBackend
для тестирования некоторых служб, которые переносят вызовы $http
(это в ngMock, а не ngMockE2E).
Похоже, что такие вещи, как expect
и when
, чувствительны к порядку параметров запроса URL. Например. если я делаю $httpBackend.when('POST','/apiCall?X=1&Y=2').respond(/* ... */)
или $httpBackend.expectPOST('/apiCall?X=1&Y=2')
, я получаю несоответствия URL, если у меня есть Y = 2 & X = 1 в URL вместо X = 1 & Y = 2.
Я хочу написать свои тесты таким образом, чтобы тестируемая служба могла свободно изменять порядок строк строки запроса URL-адреса без нарушения тестов. Я не смог найти что-либо, чтобы решить эту проблему в документации $httpBackend. Какой правильный способ сделать это?
Ответы
Ответ 1
angular будет сортировать ключи объекта params
, используемые вместе с $http.
$http({
url:"/myurl",
method:"GET",
params:{
Y:1
X:2
}});
angular будет эффективно выполнять следующие действия: Object.keys(myParams).sort()
и добавьте ключи в этом порядке.
который заканчивается '/myurl?X=2&Y=1'
Я бы предложил последовательно использовать параметры запроса не непосредственно в url, а вместо этого в параметре params:
, который будет обрабатываться angular.
Другим решением будет использование регулярных выражений в ваших тестах, что-то вроде
$httpBackend.expectPOST(/\/myurl\?((X|Y)=\d{1,}&?){2}/)
regexper
Тот факт, что вы можете использовать RegExp, действительно трудно обнаружить, поскольку редизайн документации, так как цвета не смешиваются.
Ответ 2
вы можете использовать службу $httpParamSerializer для этого:
$httpParamSerializer({ param: 1, param2: 2 });
Это вернет вам подходящую стробированную последовательность запросов, удовлетворяющую угловым $http-сервисам с параметрами.