Я пытаюсь автоматизировать мое веб-приложение, передний конец которого находится в угловом режиме и используется транспортир. Теперь я также хочу выполнить тестирование api только с помощью транспортира. Подобно отправке данных с бэкэнд должны быть такими же, как и данные, полученные в переднем конце, когда выполняется ajax-вызов, и JSON извлекается. Не удалось найти решение. Прошли многие ссылки, но решения пока нет.
Доступ к данным $ http в тестах Protractor/E2E (AngularJS)
Вот что я tried-
describe('TestApp',function()
{
var scope,
beforeEach(inject(function($rootScope,$controller,$httpBackend){
scope=$rootScope.$new();
httpBackend=$httpBackend;
httpBackend.when("POST","path/to/php/ajax.php").respond([{},{},{}]);
}));
it("abc",function(){
httpBackend.flush();
expect(scope.data.length).toBe(3);
});
});
});
Я потратил много часов, пытаясь найти решение этой проблемы. Я решил, что лучший способ действий для меня состоял в том, чтобы высмеять бэкэнд (https://docs.angularjs.org/api/ngMockE2E/service/ $ httpBackend), чтобы перехватить вызов api. Внутри ответа я прикрепил новый элемент к HTML-странице. Затем вы можете разместить JSON внутри элемента и захватить данные из элемента в вашем тесте.
$httpBackend.whenPUT(/\/api\/\/.*/).respond(function(method, url, data, headers) {
var e = document.createElement('div');
e.setAttribute('class', 'class-name'); //adds an identifier to more easily grab the data
var jd = JSON.stringify(data);
e.innerHTML = JSON.parse(jd); //Creates a JSON to place in the element, the format of data was not a valid JSON
$('body').prepend(e); //Adds the element to the start of top of the webpage
return [200, data, {}];
});
В тесте после вызова вы можете просто захватить элемент данными и получить текст для проверки:
data = element(by.css('.class-name'));
data.getText().then(function(text){
expect(text).toMatch(expected, 'Did not match');
});
Он не идеален, он немного работает, но после длительного поиска он предоставил данные, которые я искал. Я надеюсь, это поможет вам.