2014-01-10 8 views
33

分裂器テストをセットアップするためにNode Httpモジュールを使用してサーバーを直接呼び出したいとします。 Httpはコールバックベースであり、私はそれを約束に変えたいと思っています。分度器で約束を作成し操作する方法は?

例えば、私は、この関数の戻り値の約束を持つようにしたい:

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

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

    return promise; 
} 

ので、質問です:私はこれのために働くために何require()に必要と、「何とか約束を作成する」の代わりに置けばいいの?

答えて

59

分度器はWebDriverの約束を使用し、APIを「分度器」にグローバルに公開します。だから、https://code.google.com/p/selenium/source/browse/javascript/webdriver/promise.js

+4

ありがとうございます!それは役に立ちます。 https://github.com/angular/protractor/blob/master/docs/api.mdのAPIページに追加する方法はありますか? –

+1

https://github.com/angular/protractor/issues/402で追跡する – Jmr

+1

私は約束を返す関数を作成していますが、分度器でどのように解決/拒否しますか? –

2

でコードを参照してください、フルWebDriverJSプロミスAPIについて

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

を行うことができるはずこれは、これを行うには間違った方法ですが、分度器制御フローについて知ることが役立つかもしれません。通常のJavascriptを分度器の順序で実行するには、コントロールフローを使用して追加します。

この場合、約束を完了するのを待つのに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); 
}); 
関連する問題