Подтвердить что ты не робот

Как создать и манипулировать promises в Протрактор?

Я хочу использовать модуль Node Http для прямого вызова моего сервера, чтобы настроить тесты Protractor. Http - это метод обратного вызова, и я хочу превратить его в promises.

Например, я хочу, чтобы эта функция возвращала обещание:

function callMyApi() {
  var promise = // somehow create promise;

  http.request({path: '/yada/yada', method: 'POST'}, function(resp) {
    promise.complete(resp);
  });

  return promise;
}

Итак, вопрос в том, что мне нужно для require(), и вместо "как-то создать обещание" для этого работать?

4b9b3361

Ответ 1

Протрактор использует WebDriver promises и предоставляет этот API глобально на "транспортир". Таким образом, вы должны иметь возможность делать

var deferred = protractor.promise.defer();
return deferred.promise;

Для полного API-интерфейсов WebDriverJS см. код https://code.google.com/p/selenium/source/browse/javascript/webdriver/promise.js

Ответ 2

Это неправильный способ сделать это, но может быть полезно знать о потоке управления транспортиром. Если вы хотите, чтобы обычный Javascript выполнялся в ордере Protractor, добавьте его через поток управления.

В этом случае вы можете использовать свою собственную библиотеку обещаний, если хотите, просто используйте browser.wait, чтобы дождаться завершения promises.

var Promise = require('bluebird');
var promises = [];
browser.controlFlow().execute(function() {
    var p = new Promise...
    promises.push(p);
});
browser.wait( function(){ return Promise.all(promises); }, timeoutMs );

Я использую это не для обычных promises, а для операторов console.log или выполнения синхронизации для части теста или даже используя fs для печати чего-либо в тесте в файл.

var startTime, duration; 
browser.controlFlow().execute(function() {
    startTime = new Date().getTime();
});
//Protractor code you want timed
browser.controlFlow().execute(function() {
    duration = new Date().getTime() - startTime;
    console.log("Duration:", duration);
});