Angularjs 模拟$httpBackend正则表达式不匹配

Angularjs 模拟$httpBackend正则表达式不匹配,angularjs,Angularjs,我正在尝试将url与正则表达式匹配。但是下面的正则表达式不匹配 $httpBackend.whenGET('/^rest\/find-reservations\?.*/)').respond(function () { return [200, ['succes'], {}]; }); 我不断得到以下错误: Error: Unexpected request: GET rest/find-reservations?end=1421424299193&reserv

我正在尝试将url与正则表达式匹配。但是下面的正则表达式不匹配

$httpBackend.whenGET('/^rest\/find-reservations\?.*/)').respond(function () {
        return [200, ['succes'], {}];
    });
我不断得到以下错误:

Error: Unexpected request: GET rest/find-reservations?end=1421424299193&reservationClass=Reservation&start=1358352299193
No more request expected
当我将正则表达式更改为绝对字符串“/find reservations”时,会触发whenGET。为什么会这样

编辑: 我在嘲笑后端。
以下plnkr适用于静态URL和部分URL。但在上述情况下不匹配。

如果要匹配此url:

“休息/查找预订?结束=1421424299193&reservationClass=Reservation&start=1358352299193”

使用此代码:

$httpBackend.whenGET(/^rest\/find-reservations\?.*/).respond(function () {
  return [200, ['success'], {}];
});
如果您看到此错误
错误:意外请求:
这可能是由于一些原因:

  • 您忘记了
    $httpBackend.expectGET(url)
  • expectGET
    的顺序应与
    请求的顺序相同
  • 您在
    $httpBackend.flush()
    之前调用了
    $httpBackend.verifyNoOutstandingExpectation()
它与
$httpBackend.whenGET
完全无关

从:

请求期望提供了一种对应用程序发出的请求进行断言并为这些请求定义响应的方法如果未发出预期请求或请求顺序错误,测试将失败


您的代码有两个问题:

  • 将表达式封装在
    “…”
    中会使其成为字符串(即使它看起来像正则表达式)

  • 您必须在模式中包含前导的
    /


  • 您的代码应修改如下:

    $httpBackend.whenGET(/^\/rest\/find-reservations\?.*/).respond(function () {
        return [200, 'success', {}];
    });
    

    我遇到了这个问题,但在我的例子中,问题是regex是用/g global标志创建的,我想分享我的答案,以防其他人因为与我相同的原因偶然发现它

    虽然这不能回答问题,但我希望它对某些人有用:

    短版:

    不要将/g全局标志与httpBackend url匹配结合使用

    TL;DR:

    你有一个叫SOMeService的服务,它调用了一个函数,它执行一个GET请求,考虑下面的测试来演示全局标志对正则表达式的影响。
    describe('Regex demo', function() {
        afterEach(function() {
            httpBackend.flush();
        });
        describe('Normal regex used once', function() {
            var url = new RegExp(baseUrl);
            it('first test', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
        });
        describe('Normal regex used multiple times', function() {
            var url = new RegExp(baseUrl);
            it('first test', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
            it('second test, no problem', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
        });
        describe('Regex with GLOBAL flag', function() {
            var url = new RegExp(baseUrl, 'g');
            it('first test', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
            it('second test with global, this will not pass!', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
        });
        describe('Regex with GLOBAL flag in before each', function() {
            var url;
            beforeEach(function() {
                url = new RegExp(baseUrl, 'g');
            });
            it('first test', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
            it('second test, passes although regex is global, it was renewed in     the before each', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
        });
    });
    
    以下是相应的测试结果:

    意外请求:获取rest/find reservations?end=1421424968745&reservationClass=Reservation&start=0I临时硬编码开始和结束,以便更容易捕获。我在我的机器上测试了它,您忘记了
    $httpBackend.expectGET
    ,但我有几个静态whenGET,它们都可以工作。例如,$httpBackend.whenGET('rest/vn SLA')。响应(函数(){return[200,vnSlas,{}];});期望值应与请求的顺序相同!此错误显然与代码的其他部分有关,因此请发布更多代码或创建一个或准备一个提琴来解决问题。@Vincent:这个plunkr应该做什么?我没有看到任何复制您的问题的东西……它模拟后端并捕获所有请求正在发送到后端的。正如您和@Ilan Frumer提到的,这是一个正则表达式问题。我忘了从正则表达式中删除引号,并用正则表达式捕获了所有未捕获的URL/*/您知道是否可以使用带有“data”属性的正则表达式吗?我想匹配请求的数据,而不是URL?
    describe('Regex demo', function() {
        afterEach(function() {
            httpBackend.flush();
        });
        describe('Normal regex used once', function() {
            var url = new RegExp(baseUrl);
            it('first test', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
        });
        describe('Normal regex used multiple times', function() {
            var url = new RegExp(baseUrl);
            it('first test', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
            it('second test, no problem', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
        });
        describe('Regex with GLOBAL flag', function() {
            var url = new RegExp(baseUrl, 'g');
            it('first test', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
            it('second test with global, this will not pass!', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
        });
        describe('Regex with GLOBAL flag in before each', function() {
            var url;
            beforeEach(function() {
                url = new RegExp(baseUrl, 'g');
            });
            it('first test', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
            it('second test, passes although regex is global, it was renewed in     the before each', function() {
                httpBackend.expectGET(url).respond(200, {});
                someService.someFunction();
            });
        });
    });