15

Angular.js $httpBackend을 사용하여 $http 전화를 감싸는 일부 서비스 (ngMock에 있음, 이 아닌 ngMockE2E)를 테스트하고 있습니다.

expectwhen과 같은 것은 URL 쿼리 매개 변수의 순서에 민감한 것으로 보입니다. 예 : 내가 $httpBackend.when('POST','/apiCall?X=1&Y=2').respond(/* ... */) 또는 $httpBackend.expectPOST('/apiCall?X=1&Y=2')한다면 내가 대신 X = 1 & Y = 2의 URL에 Y = 2 & X = 1이있는 경우, 나는 URL 불일치를 얻을.

테스트를 거치지 않고 URL 쿼리 문자열 매개 변수의 순서를 자유롭게 변경할 수 있도록 테스트를 작성하고 싶습니다. $ httpBackend 문서에서이 문제를 해결할 수있는 방법을 찾지 못했습니다. 이 작업을 수행하는 올바른 방법은 무엇입니까?

답변

9

각도는 $ http와 함께 사용되는 params 개체의 키를 정렬합니다. Object.keys(myParams).sort() 을 그 순서대로 키를 추가합니다

$http({ 
    url:"/myurl", 
    method:"GET", 
    params:{ 
     Y:1 
     X:2 
    }}); 

는 각도는 효과적으로 다음을 수행합니다. 결국 '/myurl?X=2&Y=1'

URL에서 직접 쿼리 매개 변수를 사용하지 말고 대신에 각도가 처리 될 매개 변수 params:을 사용하는 것이 좋습니다.

$httpBackend.expectPOST(/\/myurl\?((X|Y)=\d{1,}&?){2}/)regexper

색상이하지 않는 당신이, 정규식의이 문서의 재 설계하기 때문에 탐지하는 정말 어려운 사용할 수 있다는 사실 같은

또 다른 해결책이 테스트에서 정규 표현식을 사용하는 것, 뭔가 혼합.

+0

$ HTTP 호출을 할 때 매개 변수를 사용하는 것이 유망한 것처럼 보입니다. 그래서 나는 여전히 테스트 측에서 우아한 해결책을 원합니다. (정규 표현식을 사용하면 과장된 것처럼 보이지만 심하게 영향을 미치지는 않습니다. 테스트의 가독성 ...) –

+0

그래, 나는 Regex의 읽기 또는 [변경] (https://imgflip.com/i/7i79q) – calebboyd

+0

재미 있지 않습니다 여기에 관련 키 코드 : https ://github.com/angular/angular.js/blob/86c6be82e5508762912eb08e228410f5c1ed4d91/src/ng/http.js#L1055 –

6

당신이 이것을 달성하기 위해 $ httpParamSerializer 서비스를 사용할 수 있습니다

$httpParamSerializer({ param: 1, param2: 2 }); 

이 당신을 반환하는 매칭은 PARAMS와 쿼리 문자열 angulars $ HTTP 매칭 서비스도 캐릭터 라인.

+0

굉장한 답변! –