web-dev-qa-db-ja.com

分度器を使用してフロー制御キューにPromiseを追加するにはどうすればよいですか?

私のテストでは、分度器を使用していくつかのUIテストを実行する前に、ライブラリの外部に呼び出してデータをバックエンドにシードしています。

'use strict'

var dataBuilder = require('data_builder.js');

describe('test', function () {
  var testData = {
    name: 'foo',
    title: 'bar',
    ...
  };

  beforeEach(function () {
    //create test data on the backend
    dataBuilder.create(testData).then(function (id) {
      testData.id = id.id;
    });
  });



  it('test something', function () {
    ...
  });

そのため、dataBuilderによって返されるpromiseは、it()が実際に終了する前に解決されません。 dataBuilderによって返されたpromiseをwebDriverのフロー制御に追加するにはどうすればよいですか?

16
C Deuter

分度器は分度器オブジェクトでWebDriverJSプロミスを公開するため、flow.awaitメソッドを使用するか、新しいプロミスを作成してflow.executeを使用できます。

前者は次のように達成できます。

flow = protractor.promise.controlFlow()

flow.await(dataBuilder.create(testData)).then( function(id) {
    testData.id = id.id;
})

そして、あなたはこれで後者の例を見ることができます ブログ投稿

これは、it関数自体で行うことができます。または、これがすべてのテストに共通している場合は、分度器構成のonPrepare関数に配置することを検討してください。

15
adamK

分度器のテストでは、次のパターンを使用してwebDriverのフロー制御に何かを追加します。これらの「さまざまなステートメント」からPromiseを作成して返すと、Promiseは制御フローに正しく挿入されます。

browser.controlFlow().execute(function() {
    // various statements
});
12
a-bobkov

この特定のケースでは、次のようにdonebeforeEachコールバックを使用できます。

beforeEach(function (done) {
   dataBuilder
      .create(testData)
      .then(function (id) {
         testData.id = id.id;
      })
      .finally(done);
});

doneコールバックパラメータを受け入れることは、セットアップが非同期であることを示します。

2
neXus

構文を覚えていないので、promiseの動作方法に依存しているため、覚えやすいhackを使用します(基本的に、すべてのpromiseベースのシステムでこれを使用できます)

browser.sleep(1).then(()=> {
  return someAsyncPromiseAction();
})

あなたができるもう一つのことは、単にその前の行動に頼ることです。たとえば、ボタンをクリックしただけの場合は、次のようになります。

$(' ... ').click().then( () => { return someAsync(); })

これはフロー制御に約束を追加しませんが、それでも同じ結果が得られます。

1
guy mograbi