web-dev-qa-db-ja.com

分度器でプロミスを作成および操作する方法は?

Node Httpモジュールを使用して、Protractorテストをセットアップするためにサーバーを直接呼び出します。Httpはコールバックベースであり、Promiseに変換したいです。

たとえば、この関数にpromiseを返させたいです:

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

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

  return promise;
}
_

それで、問題は、require()に何が必要で、これが機能するために「なんらかの形で約束を作成する」の代わりに置く必要があるということです。

34
Konrad Garus

分度器はWebDriverの約束を使用し、そのAPIを「分度器」でグローバルに公開します。だからあなたはできるはずです

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

完全なWebDriverJS Promise APIについては、 https://code.google.com/p/Selenium/source/browse/javascript/webdriver/promise.js のコードを参照してください。

59
Jmr

これはこれを行うための間違った方法ですが、分度器制御フローについて知ることは助けになります。通常のJavascriptを分度器の順序で実行する場合は、制御フローを介して追加します。

この場合、必要に応じて独自のpromiseライブラリを使用し、browser.wait約束が完了するのを待ちます。

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 );

これは通常の約束ではなく、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);
});
2
mvndaai