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'),我得到URL不匹配,如果我有Y = 2 & X = 1的URL,而不是X = 1 & Y = 2

我想以這樣的方式編寫我的測試,即被測試的服務可以自由地更改URL查詢字符串參數的順序而不會中斷測試。在$ httpBackend文檔中,我一直無法找到任何解決方法。什麼是正確的方法來做到這一點?

回答

9

angular將對與$ http一起使用的params對象的鍵進行排序。

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

角會做有效地執行以下操作:Object.keys(myParams).sort() 和追加的順序按鍵。 ,其最終被'/myurl?X=2&Y=1'

我將在URL中使用查詢參數不直接建議一致,而是在參數params:該角度將則過程。

另一個解決方案是在測試中使用正則表達式,像

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

,您可以使用正則表達式的真的很難,因爲文件的重新設計被發現,因爲顏色沒有事實混合。

+0

感謝 - 使用參數時,$ http調用似乎很有希望,所以我會upvote,雖然我仍然希望純粹在測試方面的優雅解決方案(使用正則表達式似乎在這裏矯枉過正,更不用說嚴重影響測試的可讀性...) –

+0

是的,我同意正則表達式的閱讀或[更改](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 }); 

這將返回匹配的字符串化的查詢字符串匹配angulars $ HTTP服務使用參數。

+0

太棒了! –