私のテストでは、分度器を使用していくつかの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のフロー制御に追加するにはどうすればよいですか?
分度器は分度器オブジェクトでWebDriverJSプロミスを公開するため、flow.await
メソッドを使用するか、新しいプロミスを作成してflow.execute
を使用できます。
前者は次のように達成できます。
flow = protractor.promise.controlFlow()
flow.await(dataBuilder.create(testData)).then( function(id) {
testData.id = id.id;
})
そして、あなたはこれで後者の例を見ることができます ブログ投稿 。
これは、it
関数自体で行うことができます。または、これがすべてのテストに共通している場合は、分度器構成のonPrepare
関数に配置することを検討してください。
分度器のテストでは、次のパターンを使用してwebDriverのフロー制御に何かを追加します。これらの「さまざまなステートメント」からPromiseを作成して返すと、Promiseは制御フローに正しく挿入されます。
browser.controlFlow().execute(function() {
// various statements
});
この特定のケースでは、次のようにdone
でbeforeEach
コールバックを使用できます。
beforeEach(function (done) {
dataBuilder
.create(testData)
.then(function (id) {
testData.id = id.id;
})
.finally(done);
});
done
コールバックパラメータを受け入れることは、セットアップが非同期であることを示します。
構文を覚えていないので、promiseの動作方法に依存しているため、覚えやすいhack
を使用します(基本的に、すべてのpromiseベースのシステムでこれを使用できます)
browser.sleep(1).then(()=> {
return someAsyncPromiseAction();
})
あなたができるもう一つのことは、単にその前の行動に頼ることです。たとえば、ボタンをクリックしただけの場合は、次のようになります。
$(' ... ').click().then( () => { return someAsync(); })
これはフロー制御に約束を追加しませんが、それでも同じ結果が得られます。