2016-04-06 17 views
0

私はAngularJS 1.5.3プロジェクトで作業していましたが、私は約束の連鎖に問題があります。

私はそのような機能を持っています。だから、配列が

[ 
    0 => string 
    1 => a function that return promise 
    2 => a function that confirms that the previous function effects took place 
] 

で構成されている

私はあなたが私はここにしようとしているかを見ることができると思い

this.login = function(u,p){ var promise=$auth.login(u,p).then(...); return promise;} 
this.tests = [ 
    ['Im LoginController, i let users login'], 
    ['I have logs attr, to bind current state to view',null,function(){return !!angular.isArray(self.log)}], 
    ['I have $auth attr, that expse the $auth service',function(){return !!(self.$auth===$auth)}], 
    ['I can get tokens from server',null,function(){return self.login({u:1,pass:1234})},function(){return !!($auth.currentUser.id === 1 && $auth.currentUser.hasValidToken()===true)} 
]; 

...私は視覚教材を提示するコントローラを自動テストするためのディレクティブを作成したいです - anyhow-、

私が必要とするのは、配列をループして順番に実行し、[1,2]に対してtrue/falseを返すことです。

私の最初の試みは、当然のことながら、彼らは順番に実行されないので、

<ul> 
    <li ng-if="$last ng-repeat="test in tests">{{test[0]}} :: {{test[1]() && test[2]()}}</li> 
</ul> 

ngRepeatは、非常に悪い失敗使っAngular1テンプレートに直接でした。だから私は約束でそれらを包む必要があることを知った?

+0

'tests'が配列の場合、配列が保証されていないオブジェクトを反復する場合、配列の順番どおりに反復します。しかし、ngリピートでは、それらはすべて同時にかなり実行されます。角度バインディングに頼るのではなく、コードですべてのことを行うようにしたい場合は、[$ q.all](https://docs.angularjs.org/api/ng/service/$q#all)をご覧ください。テストしやすくなります。 – ste2425

+0

@ ste2425配列は配列を含み、 'string、function' $ q.allという混合値はすべて処理できますか? – Zalaboza

答えて

1

コントローラですべてのテストを実行する前に、コントローラをng-repeatでレンダリングしてから$q.all()を使用して、結果が別の変数に格納されていることを確認してください。これらの線に沿った特定の何かで:

var testCases = [ 
    ['Im LoginController, i let users login'], 
    ['I have logs...', null, function(){return !!angular.isArray(self.log)}], 
]; 

var promises = []; 

scope.testResults = []; 
scope.testsExecuted = false; 

for (var i = 0; i < this.pendingScenarios.length; i++) { 
    var testCase = this.testCases[i]; 
    if (testCase[1]) { 
     var result = $.when(testCase[1]()); 
     result.then(function(result) { 
      testResults[i] = result; 
     }); 
     promises.push(result); 
    } 
    // ... 
} 

$q.all(promises).then(function() { 
    $scope.testsExecuted = true; 
}); 

私は、コードをテストしていないが、私はあなたのアイデアを得ると思います。テストがプロミスを返す場合は配列に入れ、最後にresult.then()の結果を格納している間にそれらがすべて解決されていることを確認します。

+0

'$ q.when'を使って、約束事で約束を守ることができます。それからあなた自身はチェックする必要はありませんが、' $ q.all'もこれを行います。そして、 '$ q.all'に一連の約束を渡して、結果を結合させます。 '$ q.all'は約束の配列から解決されたすべての値で解決されます。だからあなたは自分でそれを行う必要はありません。 https://jsfiddle.net/29n63c1s/ – ste2425

+0

あなたはそうです... – martin

+0

@ ste2425フィドルのおかげでありがたいですが、$ q.when()でラップされたときにすべての関数がnullを返す理由は何ですか? $ q.when(function(){true true})、..または$ qを返す場合でも、関数は常にnullを返します。var promises = [$ q.when(function(){return 10;}) 。いつ – Zalaboza