Как я могу сделать $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-сервисам с параметрами.