我在$ resource GET请求中传递了一个url作为参数。 Angular是对此参数进行编码的url,并且在$ httpBackend.expectGET方法中匹配请求是挑剔的。
我发现您可以使用正则表达式来匹配预期的请求但无法使其工作。我想匹配资源位置,但要匹配任何“uri”查询字符串参数值。
控制
var resource = $resource('../api/lookup');
resource.get({ uri: "http://www.something.com" }, function (data) {
// do something
});
测试
// mock out the $httpBackend response
$httpBackend.expectGET(/\.\.\/api\/lookup\?uri=.*/)).respond(200, { Response: "a response" });
// call my test method here
// ensure the $httpBackend work is done
$rootScope.$apply();
$httpBackend.flush();
// do assertions
业力输出
Error: Unexpected request: GET ../api/lookup?uri=http%3A%2F%2Fwww.something.com
Expected GET /../api/lookup?uri=.*/
有人能看出为什么我的正则表达不匹配吗?
修改
即使按照建议改进了正则表达式,我也无法使用' $ var '注入语法来实现这一点。我重写了测试,使用inject函数注入依赖项并确保我的测试安排的顺序是正确的。现在它的工作就像一个魅力!
答案 0 :(得分:8)
您需要在正则表达式中转义问号。
如果没有转义它,你只需将它之前的标记标记为可选。
> test = "../api/lookup?uri=http%3A%2F%2Fwww.something.com";
> test.match(/\.\.\/api\/lookup?uri=.*/);
null
> test.match(/\.\.\/api\/lookup\?uri=.*/);
["../api/lookup?uri=http%3A%2F%2Fwww.something.com"]
答案 1 :(得分:6)
您需要使用双斜杠\\?
来转义问号$httpBackend.expectGET(/\.\.\/api\/lookup\\?uri=.*/)).respond(200, { Response: "a response" });
另外你可能想要写这样的正则表达式:
new RegExp('../api/lookup\\?uri=.*')
当转义斜杠后面跟一个修饰符
时,//语法有困难