如何使$ httpBackend对URL查询参数的顺序不敏感?

时间:2014-03-12 20:28:55

标签: angularjs angular-http angularjs-http httpbackend angular-mock

我正在使用Angular.js $httpBackend来测试一些包含$http调用的服务(这是在ngMock中,不是 ngMockE2E)。

似乎expectwhen之类的内容对URL查询参数的顺序很敏感。例如。如果我$httpBackend.when('POST','/apiCall?X=1&Y=2').respond(/* ... */)$httpBackend.expectPOST('/apiCall?X=1&Y=2'),如果我在网址中 Y = 2& X = 1 而不是 X = 1& Y =,则会出现网址不匹配2

我想以这样一种方式编写我的测试,即被测试的服务可以自由地更改URL查询字符串参数的顺序而不会破坏测试。我在$ httpBackend文档中找不到任何解决方法。什么是正确的方法?

2 个答案:

答案 0 :(得分:9)

angular将对与$ http一起使用的params对象的键进行排序。

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

Angular将有效地执行以下操作:Object.keys(myParams).sort() 并按顺序附加键。 最终成为'/myurl?X=2&Y=1'

我建议不要直接在网址中使用查询参数,而是在角度将处理的参数params:中使用。

另一种解决方案是在测试中使用正则表达式,例如

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

由于文档重新设计,您可以使用RegExp的事实很难发现,因为颜色不会混合。

答案 1 :(得分:7)

您可以使用$ httpParamSerializer服务来实现此目的:

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

这将返回一个匹配的字符串化查询字符串,匹配angulars $ http service with params。