2017-02-07 13 views
1

私は分裂器で書かれた私の最後の2-endテストでJasmineを使用しています。私は私のソリューションで定義された他のページオブジェクトの基本クラスとして使用されるページオブジェクト抽象化を作成しようとしています。ジャスミン非同期テストの問題

私のアプリケーションは古典的なフォームベースのソリューションなので、編集ページの一般的な動作をベースクラスに集めることができます。 M **パターンにもっと近づけるには、抽象ビューとコンクリートモデルを接続したいと思います。

だから私の基本ページオブジェクト・ビューは、次のようになります。

T
export class EditPageBase<T> { 
    constructor(T model) { 
     this.model = model; 
    } 

    fillForm() { 
     ... 
    } 

    checkForm() { 
     ... 
    } 
} 

- このビューに関連したクラスモデル。

このアプローチでは、モデル構造を使用して、自分のビューに直接マッピングできます。したがって、モデルで定義されたプロパティは、私の見解では対応表現を持っています。

だから私はビューに私のモデルをマッピングするために、次の構文を使用できます。

for(let prop in this.model) { 
    let ctrl = this.getControl(prop); 
    ctrl.sendKeys(this.model[prop]); 
} 

は、だから私のフォームがいかに複雑で重要ではありません - 私は私のモデルが正しい定義にのみ必要です。

私は、ページデータを要求するときに分度器が約束を返すよう、フォームのデータをチェックして経験する問題:

for(let prop in this.model) { 
    let ctrl = this.getControl(prop); 
    expect(ctrl.getAttribute('value')).toEqual(this.model[prop] || ''); 
} 

このコードの時間を時間をスロー:

A Jasmine spec timed out. Resetting the WebDriver Control Flow.

Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

これがなぜ起こるか私はアイデアを持っています私のループは早く終わり、約束が解決されるからです。私はこのような状況に対処する方法を知らない。ジャスミンが約束通りに動作するので、私は約束チェーンや他のPromise.allラッパーを作成したくないので、ここでコードをきれいにしておきたい。

誰かが以前にこの問題を抱えていた可能性があります。ここでジャスミンパワーを使用する方法をいくつか考えてみましょう。

答えて

0

あなたはジャスミンでit方法にdoneコールバックを渡すことができ、および非同期作業が完了したら、あなたのテストでは、あなたの非同期コードが終了したことをジャスミンに知らせるために、このdone機能を呼び出すことができ、例えば:

it('does something', function(done) { 
    someAsyncMethod().then(function() { 
     expect(true).toEqual(true); 
     done(); // signal to Jasmine async operation is complete 
    } 
}); 

は、より多くの情報

+0

ためJasmine docsを参照してください応答をいただき、ありがとうございます。はい、私は 'done'について知っていますが、これは私が必要とするものではありません。私はループ内ですべての約束を待つ必要があり、これまでは関数の実行が終わっていないという問題があります。 Jasmineは 'done'コールバックがなくても約束しています。 – VadimB