如何在AngularJS $ httpBackend ExpectGET中使用正则表达式

dad*_*and 13 regex angularjs httpbackend

我在$ resource GET请求中传递了一个url作为参数.Angular是对此参数进行编码的url,并且在$ httpBackend.expectGET方法中匹配请求是挑剔的.

我看到你可以使用正则表达式来匹配预期的请求,但无法让它工作.我想匹配资源位置,但与任何"uri"查询字符串参数值匹配.

按Ctrl

var resource = $resource('../api/lookup');
resource.get({ uri: "http://www.something.com" }, function (data) {
  // do something
});
Run Code Online (Sandbox Code Playgroud)

测试

// 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
Run Code Online (Sandbox Code Playgroud)

业力输出

Error: Unexpected request: GET ../api/lookup?uri=http%3A%2F%2Fwww.something.com

Expected GET /../api/lookup?uri=.*/
Run Code Online (Sandbox Code Playgroud)

谁能明白为什么我的正则表达式不匹配?

编辑

即使按照建议改进了正则表达式,我也无法使用' $ var '注入语法来实现这一点.我重写了测试,使用inject函数注入依赖项并确保我的测试安排的顺序是正确的.现在它的工作就像一个魅力!

Joh*_*ter 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"]
Run Code Online (Sandbox Code Playgroud)


Lan*_*erV 6

你需要用双斜杠\\来逃避问号?

$httpBackend.expectGET(/\.\.\/api\/lookup\\?uri=.*/)).respond(200, { Response: "a response" });
Run Code Online (Sandbox Code Playgroud)

另外你可能想写这样的正则表达式:

new RegExp('../api/lookup\\?uri=.*')
Run Code Online (Sandbox Code Playgroud)

当转义斜杠后面跟一个修饰符时,//语法有困难