【问题标题】:How to use regex in AngularJS $httpBackend ExpectGET如何在 AngularJS $httpBackend ExpectGET 中使用正则表达式
【发布时间】:2013-10-30 02:34:09
【问题描述】:

我在 $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
});

测试

// 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' 注入语法使其正常工作。我重写了测试,使用注入函数注入依赖项,并确保我的测试安排的顺序是正确的。现在它就像一个魅力!

【问题讨论】:

    标签: regex angularjs httpbackend


    【解决方案1】:

    您需要转义正则表达式中的问号。

    不转义它,您只是将其前面的令牌标记为可选。

    > 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"]
    

    【讨论】:

    • 为修复我的正则表达式干杯。不幸的是,Angular 仍然不匹配请求。我会继续寻找以防我能解决整个问题,但如果不能解决,我会回来接受这个作为答案。
    【解决方案2】:

    您需要用双斜杠 \\? 转义问号?

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

    此外,您可能希望像这样编写正则表达式:

    new RegExp('../api/lookup\\?uri=.*')
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      相关资源
      最近更新 更多