Подтвердить что ты не робот

Mock $httpBackend regex не соответствует

Я пытаюсь сопоставить url с регулярным выражением. Но регулярное выражение follwing не соответствует.

$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-адресов и частичных файлов. Но это не в приведенном выше случае.

4b9b3361

Ответ 1

Если вы хотите совместить этот URL-адрес:

"отдых/найти-резервирование конца = 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:

Запросы ожиданий обеспечивают способ сделать утверждения о запросах, сделанных приложением, и определить ответы для этих запросов. Тест завершится неудачно, если ожидаемые запросы не будут выполнены или они сделаны в неправильном порядке

Ответ 2

В коде есть две проблемы:

  • Включение выражения в '...' делает его строкой (даже если оно выглядит как регулярное выражение.

  • Вы должны включить ведущий / в свой шаблон.


Ваш код должен быть изменен следующим образом:

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

Ответ 3

 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');          

Ответ 4

Я столкнулся с этим вопросом, но в моем случае проблема заключалась в том, что регулярное выражение было создано с глобальным флагом /g, и я хотел бы поделиться своим ответом в случае, если кто-то еще наткнулся на него по той же причине, что и я.

Хотя это не отвечает на вопрос, я надеюсь, что это полезно для кого-то, тем не менее:

Краткая версия:

Не используйте глобальные флаги /g в сочетании с соответствием URL-адреса httpBackend.

TL; ДР:

Если у вас есть служба под названием SomeService с функцией someFunction, которая выполняет запрос 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();
        });
    });
});

Вот соответствующие результаты теста: введите описание изображения здесь