Может ли адаптация Protractor Jasmine правильно дождаться protractor.promise.defer().promise?

Прежде всего, снимаю шляпу перед командой и сообществом Protractor за то, что они придумали такую ​​библиотеку для такой сложной задачи, как E2E-тестирование.

У меня есть JS-класс-оболочка вокруг ElementFinder, так как я хотел добавить дополнительные служебные методы для дальнейшей проверки ElementFinder. Когда я возвращаю экземпляр таких объектов класса, я возвращаю его с помощью:

function myFunc(){
   var myElement = element(by.binding('plan.name'));
   var deferred = protractor.promise.defer();
   var myWrapper = new myElementWrapper(myElement);
   deferred.fulfill(myWrapper);
   return deferred.promise;
}

Позже я ожидаю значение в Jasmine 2.1, используя:

var val=myFunc();
expect(val).not.toBeNull();

Согласно официальной документации от Protractor queen,@juliemr , expect должен ждать, пока обещание не будет разрешено. Кажется, что он мчится, не останавливаясь. Глядя на экземпляр обещания, сгенерированного моим кодом, я вижу, что он имеет тип: goog.scope.promise.Promise. В коде Protractor я заметил, что он использует: webdriver.promise.isPromise(res). Я также безуспешно пытался обернуть вызов flow.execute и хотел бы избежать использования серии связанных вызовов .then, поскольку это делает тест менее читаемым.

Будет ли это должным образом ждать, чтобы выполнить мое обещание выше, прежде чем продолжить тестовый поток?

Если нет, то как правильно создать объект обещания, который будет должным образом проверен ароматом Protractor expect?

Я использую новую и блестящую версию Protractor 2.0.


person Gabriel Kohen    schedule 14.04.2015    source источник


Ответы (1)


Вы создаете deferred, затем немедленно выполняете deferred и возвращаете обещание для него (это просто сложный способ прямого возврата объекта myWrapper).

Промисы используются для представления значения, которого у вас еще нет. Я не вижу в вашем примере ничего, что не было бы доступно сразу, поэтому непонятно, зачем вам обещание.

Я думаю, вы хотите что-то вроде этого:

function myFunc() {
   var myElement = element(by.binding('plan.name'));
   return new myElementWrapper(myElement);
}

Однако ваш myElementWrapper должен выглядеть как обещание, если вы хотите передать его expect (если вы расширите существующий ElementFinder, этого должно быть достаточно).

person P.T.    schedule 15.04.2015
comment
Извините, ошибка копирования и вставки. Правильный код выше. Двух обещаний не бывает. Проблема все еще сохраняется. - person Gabriel Kohen; 17.04.2015
comment
Я удалил эту часть своего ответа. Остальное все еще применимо, я думаю. - person P.T.; 18.04.2015