3

Я строю тест E2E с угловым применением с помощью Protractor. Бэкэнд-HTTP-сервисы издеваются над $httpBackend. До сих пор, тест выглядит следующим образом:Как утверждать, что была вызвана конечная точка бэкэнд?

describe('foo', function() { 
    it('bar', function() { 
    var backendMockModule = function() { 
     angular 
     .module('backendMock', []) 
     .run(['$httpBackend', function ($httpBackend) { 
      $httpBackend.whenPUT('http://localhost:8080/services/foo/bar') 
      .respond(function (method, url, data, header) { 
       return [200, {}, {}]; 
      }); 
     }]); 
    }; 
    browser.addMockModule('backendMock', backendMockModule); 

    browser.get('http://localhost:8001/#/foo/bar'); 

    element(by.id('baz')).click(); 

    // here I would like to assert that the Angular app issued a PUT to '/foo/bar' with data = {...} 
    }); 
}); 

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

Как утверждать, что конечная точка HTTP-сервера была вызвана с правильными данными, методом, заголовками и т. Д.?

Я пытался это сделать, как это (добавление hasBeenCalled переменной):

describe('foo', function() { 
    it('bar', function() { 
    var hasBeenCalled = false; 

    var backendMockModule = function() { 
     angular 
     .module('backendMock', []) 
     .run(['$httpBackend', function ($httpBackend) { 
      $httpBackend.whenPUT('http://localhost:8080/services/foo/bar') 
      .respond(function (method, url, data, header) { 
       hasBeenCalled = true; 
       return [200, {}, {}]; 
      }); 
     }]); 
    }; 
    browser.addMockModule('backendMock', backendMockModule); 

    browser.get('http://localhost:8001/#/foo/bar'); 

    element(by.id('baz')).click(); 

    expect(hasBeenCalled).toBeTruthy(); 
    }); 
}); 

Но это не работает. Я не знаю точно, как Protractor выполняет тестирование, но я полагаю, что он отправляет сериализованную версию функции в браузер в вызове addMockModule вместо запуска теста в том же процессе, что и веб-страница, и поэтому я не может разделить состояние между тестом и браузером (вопрос стороны: это правильно?).

ответ

0

$httpBackend.flush() необходимо прежде чем ожидать (...) ...

Смежные вопросы