2016-06-11 13 views
2

角型アプリケーション用のe2eテスト、特に3つの選択入力があるフォームを作成しようとしています。テストでは、これらの選択肢からランダムなオプションを選択する必要があります。最初の選択には既にデータが入力されていますが、前の選択が非同期に選択されると、他の2つの選択が非同期に行われ、相互に依存します。分度器 - 動的に入力された角型をテストする

選択入力もng-disabledを使用し、ng-repeat式ごとに使用可能なオプションがある場合にのみ有効になります。

私は私のテストでページオブジェクトのアプローチを使用しています、と私は私のテストに必要なランダム選択動作を実現するために、いくつかのユーティリティ関数を作成しようとしています:

ページオブジェクト:

this.selectRandomCustomer = function() { 
    var option, 
     randomIndex; 
    this.customerSelect.click(); 
    this.customerSelectOptions.count().then(function(count) { 
     randomIndex = Math.floor(Math.random() * count); 
     option = element(by.repeater('customer in vm.customers').row(randomIndex)); 
     option.click(); 
    }); 
    }; 

    this.selectRandomOrder = function() { 
    if(this.orderSelect.isEnabled()===true) { 
     var option, 
     randomIndex; 
     this.orderSelect.click(); 
     this.orderSelectOptions.count().then(function(count) { 
     randomIndex = Math.floor(Math.random() * count); 
     option = element(by.repeater('order in vm.orders').row(randomIndex)); 
     option.click(); 
     }); 
    } 
    }; 

orderSelectは、customerSelectからオプションを選択した後でオプションを設定した場合にのみ選択することができますので、this.customerSelectOptions.count()を呼び出すと返された約束のフックが返されたので、this.selectRandomOrder私は分度器から、それがselectRandomOrder機能を見つけることができないと言っている間違いを得るので、これは未定義です。

今は、最初のページロード時に常に読み込まれるので、オプションを選択するための最初の選択しかできません。

また、isEnabled()を実際に使用しているかどうかはわかりませんが、これは私の2番目の入力に対して真実に戻っているはずですが、これをログアウトすると、私はfalseと表示されます。これはng-disabledでは機能しませんか?

最初にデータが入力されていないフォームの入力を処理し、角度を取得して使用可能なオプションを取り込むのを待っているベストプラクティスは何ですか?

おかげ

UPDATE:

私の代わりにdisabled財産の存在をチェックgetAttribute()への呼び出しを使用して作業にこれを持っています。だから、itブロックでの私のspecファイルから

私はselectRandomCustomerでオプションをクリックした後selectRandomOrderを呼び出すために私ができるようにしたいと思い何

page.customerSelect.getAttribute('disabled').then(function(result){ 
    if(!result) { 
     page.selectRandomCustomer(); 
    } 
}); 

page.orderSelect.getAttribute('disabled').then(function(result){ 
    if(!result) { 
     page.selectRandomOrder(); 
    } 
}); 

理想的にされて呼び出すことができます。

this.selectRandomCustomer = function() { 
    var option, 
     randomIndex; 
    this.customerSelect.click(); 
    this.customerSelectOptions.count().then(function(count) { 
     randomIndex = Math.floor(Math.random() * count); 
     option = element(by.repeater('customer in vm.customer').row(randomIndex)); 
     option.click(); 
     //Like to be able to call selectRandomOrder but only after angular has finished performing AJAX request for data and received response 
    }); 
}; 

this.selectRandomOrder = function() { 
    var option, 
     randomIndex; 
    this.orderSelect.click(); 
    this.orderSelectOptions.count().then(function(count) { 
     randomIndex = Math.floor(Math.random() * count); 
     option = element(by.repeater('order in vm.orders').row(randomIndex)); 
     option.click(); 
    }); 
}; 

私はすぐにoption.click()this.selectRandomOrderを呼び出してみましたが、私はそのような機能を言っていないエラーを取得し、thisが返さ約束の関数コールバック内からアクセスできないようです。

答えて

2

掲載コード内の少なくとも1つの大きな問題があります:

if(this.orderSelect.isEnabled()===true) { 

ここisEnabled()は約束を返します。値を確認するために解決する必要があります:

var self = this; // saving the page object reference 
this.orderSelect.isEnabled().then(function (isEnabled) { 
    if (isEnabled) { 
     var option, 
      randomIndex; 
     self.orderSelect.click(); 
     self.orderSelectOptions.count().then(function(count) { 
      randomIndex = Math.floor(Math.random() * count); 
      option = element(by.repeater('order in vm.orders').row(randomIndex)); 
      option.click(); 
     }); 
    } 
}); 
+0

ああ、はい、少なくとも1つの大きな問題があります。では、私はここで何をしなければならないのですか?ありがとう – mindparse

+0

@mindparseそれは依存しています...問題の現在の状態は何ですか?あなたはそれを作ったのですか?ありがとう。 – alecxe

+0

ありがとう、私はそれを動作させたが、isEnabled()の代わりにgetAttribute()を使用しています。私は、isEnabledがng-disabledでうまくいかないかについて何かを読んだと思います。とにかく、私のアップデートを見れば、理想的には私のページオブジェクト内の関数への連鎖呼び出しまで、それぞれの約束コールバックの中からさらなる関数を呼びたいと思っています。こうすることで、私はテスト仕様ファイルから呼び出すことができる 'selectOptions'のようなユーティリティ関数を1つだけ持つことができます。 – mindparse

関連する問題