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

Eug*_*sky 16 angularjs angular-http httpbackend angularjs-http 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')URL中有Y = 2和X = 1而不是X = 1和Y = 2,则会出现URL不匹配.

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

cal*_*oyd 9

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

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

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

我建议不要直接在url中使用查询参数,而是在params:angular将处理的参数中.

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

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

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


ray*_*ard 7

你可以使用$ httpParamSerializer服务来实现这个目的:

$httpParamSerializer({ param: 1, param2: 2 });
Run Code Online (Sandbox Code Playgroud)

这将返回一个匹配的字符串化查询字符串匹配angulars $ http服务与params.