16

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

似乎对 URL 查询参数expectwhen顺序很敏感。例如,如果我这样做$httpBackend.when('POST','/apiCall?X=1&Y=2').respond(/* ... */)或,如果我在 URL 中有Y=2&X=1而不是X=1&Y=2$httpBackend.expectPOST('/apiCall?X=1&Y=2'),我会得到 URL 不匹配。

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

4

2 回答 2

9

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

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

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

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

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

$httpBackend.expectPOST(/\/myurl\?((X|Y)=\d{1,}&?){2}/) 正则表达式

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

于 2014-03-12T21:51:19.000 回答
7

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

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

这将返回一个匹配的字符串化查询字符串匹配 angulars $http 服务和参数。

于 2015-07-24T13:23:03.037 回答