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

时间:2014-01-16 17:45:05

标签: angularjs

我正在尝试将网址与正则表达式匹配。但是后面的正则表达式并不匹配。

$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。这是为什么?

编辑: 我在嘲笑后端。 http://plnkr.co/edit/VF4KbZO3FvngWQsiUcte?p=preview 以下plnkr适用于静态URL和部分。但它不适用于上述情况。

4 个答案:

答案 0 :(得分:15)

如果你想匹配这个网址:

<强> “休息/找到的预约结束= 1421424299193&安培; reservationClass =预定&安培;开始= 1358352299193”

使用此代码:

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

如果您看到此错误Error: Unexpected request:

可能出于某些原因:

  • 您忘了$httpBackend.expectGET(url)
  • expectGET的顺序应与requests的顺序相同。
  • 您在$httpBackend.verifyNoOutstandingExpectation()之前致电$httpBackend.flush()

它根本与$httpBackend.whenGET无关。

来自$httpBackend docs

  

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

答案 1 :(得分:9)

您的代码存在两个问题:

  1. 将表达式括在'...'中使其成为一个字符串(即使它看起来像正则表达式。

  2. 您必须在模式中包含前导/


  3. 您的代码应该像这样修改:

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

答案 2 :(得分:1)

 this.httpBackend.whenGET(new RegExp('.*')).respond(function(){ return [200, 'MISS', {}] });
 this.httpBackend.whenPOST('/report/').respond(function(){return [200, 'HIT', {}] ; });
 this.httpBackend.whenPOST(new RegExp('.*')).respond(function(){ return      [200, 'MISS', {}] });

var _received;

var result = this.reportService.save(new this.Report());
result.then(function(response){
    _received = response.data;
});          
this.httpBackend.flush();
expect(_received).toBe('HIT');          

答案 3 :(得分:1)

我遇到了这个问题,但在我的情况下问题是正则表达式是用/ g全局标志创建的,我想分享我的答案,以防其他人因为我做的原因而偶然发现它。

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

简短版:

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

<强> TL; DR:

假设您有一个名为SomeService的服务,其中有一个名为someFunction的函数执行GET请求,请考虑以下测试,以证明全局标志对正则表达式的影响。

mount -o rw,remount,rw /system
mount -o rw,remount,rw /proc

chmod 666 /proc/meminfo

if [ ! -f /proc/meminfo ]; then
    sed -i '6 i\echo "0,5120,10240,20480,40960,65536" >/sys/module/lowmemorykiller/parameters/minfree' /system/0211/0211perf.sh
    sed -i '6 i\echo "6144,12288,18432,32768,49152,57344" > /sys/module/lowmemorykiller/parameters/minfree' /system/0211/0211ecoe.sh
    sed -i '23 i\if [ $REPLY == '0,5120,10240,20480,40960,65536' ]; then' /system/0211/0211tr.sh
    sed -i '27 i\elif [ $REPLY == '6144,12288,18432,32768,49152,57344' ]; then' /system/0211/0211tr.sh
else
head -n 1 /proc/meminfo | cut -d":" -f2 | sed '/s[kbKB ]//g' > /tmp/detecttram
if [ /tmp/detecttram -le 714752]; then
    sed -i '6 i\echo "0,5120,10240,20480,40960,65536" > /sys/module/lowmemorykiller/parameters/minfree' /system/0211/0211perf.sh
    sed -i '6 i\echo "6144,12288,18432,32768,49152,57344" > /sys/module/lowmemorykiller/parameters/minfree' /system/0211/0211ecoe.sh
    sed -i '23 i\if [ $REPLY == '0,5120,10240,20480,40960,65536' ]; then' /system/0211/0211tr.sh
    sed -i '27 i\elif [ $REPLY == '6144,12288,18432,32768,49152,57344' ]; then' /system/0211/0211tr.sh
else
    sed -i '6 i\echo "0,6144,16384,32768,57344,76288" > /sys/module/lowmemorykiller/parameters/minfree' /system/0211/0211perf.sh
    sed -i '6 i\echo "8192,16384,32768,65536,98304" > /sys/module/lowmemorykiller/parameters/minfree' /system/0211/0211ecoe.sh      
    sed -i '23 i\if [ $REPLY == '0,6144,16384,32768,57344,76288' ]; then' /system/0211/0211tr.sh
    sed -i '27 i\elif [ $REPLY == '8192,16384,32768,65536,98304' ]; then' /system/0211/0211tr.sh
fi
fi

chmod 444 /proc/meminfo  

以下是相应的测试结果: enter image description here