Тест транспортира/жасмина выдает UnknownError: неизвестная ошибка: превышен максимальный размер стека вызовов

У меня есть тест, который каждый раз, когда я его запускаю, выдает "UnknownError: неизвестная ошибка: превышен максимальный размер стека вызовов."

Этот тест вызывает метод в одной из моих служб, который записывает данные на Google Диск.

Неудачный тест вызывает мою функцию doDrive с «ui», что означает обновление элемента диска. Если я изменяю один символ «ui» -> «ni», что означает создание нового элемента диска, тест работает. Тестируемый код отлично работает при обычном использовании.

it('should update a file', function() {
browser.executeAsyncScript(function(callback) {
    // get service
    var service=angular.element(document.getElementById('ngapp')).injector().get('DriveQ')
    // generate a title
    var title = 'title of file';
    // call doDrive to create a new file
    service.doDrive({t:'ui',id:'0B6B-RNrxsCu2Sll7JZTYy2aDA', item:{title:title}})
        .then(function (resp){
                    resp.originalTitle=title;
                    callback(resp)
            });
}).then(function(resp) {
    expect(resp.title).toEqual(resp.originalTitle);
});
});

Я использую веб-драйвер Chrome напрямую, и у меня также есть browser.ignoreSynchronization = true;


person pinoyyid    schedule 12.09.2014    source источник
comment
Как выглядит ваш сервис?   -  person Abraham P    schedule 21.09.2014
comment
это большой сложный фрагмент кода, который создает и отправляет транзакции REST API Google Диска. Ключевые моменты... (1) сервис работает нормально, сломан только тест, (2) путь кода практически идентичен между рабочим тестом (REST PUT) и тестом, который не работает (REST POST). Есть ли какой-то конкретный аспект услуги, который может иметь значение?   -  person pinoyyid    schedule 21.09.2014
comment
есть несколько вещей, которые обычно вызывают это конкретное исключение. Очевидная вещь, которая приходит на ум, — это $watch на объекте.   -  person Abraham P    schedule 21.09.2014
comment
Я не использую $watch в своем приложении.   -  person pinoyyid    schedule 22.09.2014


Ответы (1)


У меня такая же проблема. Я обнаружил, что возврат больших объектов из браузера в транспортир приводит к ошибке "UnknownError: неизвестная ошибка: превышен максимальный размер стека вызовов".

Вы должны проверить сложность объекта resp, который вы отправляете обратно с обратным вызовом. Если он слишком большой, попробуйте отправить меньше данных.

Это может произойти с executeAsyncScript, executeScript и evaluate (которые используют executeScript).

Редактировать OP...

Исправлено изменением callback(resp) на callback({title:resp.title}), т.е. упрощением возвращаемого объекта, чтобы он содержал только те элементы, которые я утверждаю.

person Offirmo    schedule 25.09.2014
comment
Я обнаружил, что вы также не можете передавать слишком большие объекты в браузер. Я использую второй параметр browser.executeScript для передачи элемента, и мне пришлось использовать функцию getWebElement, чтобы избежать этой ошибки. - person Olov; 18.08.2015