我正在使用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')
,如果我在网址中 Y = 2& X = 1 而不是 X = 1& Y =,则会出现网址不匹配2
我想以这样一种方式编写我的测试,即被测试的服务可以自由地更改URL查询字符串参数的顺序而不会破坏测试。我在$ httpBackend文档中找不到任何解决方法。什么是正确的方法?
答案 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。