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-адресов и частичных файлов. Но это не в приведенном выше случае.
Ответы
Ответ 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();
});
});
});
Вот соответствующие результаты теста:
![введите описание изображения здесь]()