1

Siesta で Ext JS フロントエンドをテストしています。これが私のログイン/ログアウトテストです:

StartTest(function(t) {
    t.diag("Login/Logout");
    t.chain(
        { waitForCQ : '#loginPanel' },
        function(next) {
            t.cq1("#username").setValue();
            t.cq1("#password").setValue();
            next();
        },
        { click: '>> #username' },
        { type: '******', target : '>> #username' },
        { type: '******', target : '>> #password' },
        { click: '>> #loginButton' },
        { waitForCQ: '#mainView' },
        { click: '>> #logoutButton' },
        { waitForCQ: 'messagebox #ok' },
        function(next) {
            t.waitForEvent(Ext.globalEvents, 'logoutComplete', function () {});
            next();
        },
        { click : '>> messagebox #ok' },
        function() {
            t.done();
        }
    );
});

このテストでは、ユーザー名とパスワードをログイン パネルに入力し、ログイン ボタンをクリックします。メイン ビューが読み込まれると、ログオフします。何らかの理由で、このテストは決して終了しません。

チェーン内のすべてのアクションは成功しますが、テストはまだ実行中のままです。

どうすればこれを修正できますか?

ExtJS 5.1.0 で siesta-3.0.2-lite を使用しています。

4

2 に答える 2

2

1# 最初にt.done()の削除を試みることができます。実際に待っている場合を除き、通常、テストでは必要ありません。ハーネス設定のneedDoneのデフォルト値は False です。

2# あなたは waitForEvent を使用しています。これは通常、そこにコールバックを渡すときに行われます。したがって、関数は次のようになります。

function(next) {
    t.waitForEvent(Ext.globalEvents, 'logoutComplete', next);
},

ただし、イベントが発生したことだけを知りたい場合は、関数firesOnceを使用できます。イベントをトリガーするアクションを実行する前に、イベントのチェックを登録する必要があることを忘れないでください。

したがって、コードは次のようになります。

 function(next) {
     t.firesOnce(Ext.globalEvents, 'logoutComplete','Logout completed!');
     next();
 },
 { click: '>> #logoutButton' },
 { waitForCQ: 'messagebox #ok' },
 { click : '>> messagebox #ok' },

しかし、Ext.globalEvents を使用してイベントをチェックしたことがないため、機能するかどうかはわかりません。

于 2015-07-08T12:58:41.180 に答える
1

フォーラムの Siesta 開発者は、ハーネス構成で overrideSetTimeout を false に設定することでこれを解決することを提案しました。

Harness.configure({
    ...
    overrideSetTimeout: false,
    ...
});

Siesta は、非同期コード追跡の各テストのコンテキストからネイティブの「setTimeout」をオーバーライドしますが、問題が発生するようです。それは私の問題を解決しなかったので、それがあなたのために働くかどうか教えてください.

アップデート:

私の側の問題は、を使用するログアウト自体が原因であることが判明しましたwindow.location.reload()。これにより、2 つの別個のページ/アプリケーションがある場合にブラウザーが動作します。

どうやら、ハーネス オブジェクトのseparateContextオプションを trueに設定する必要があるようです。このオプションは、標準 (商用) パッケージでのみ使用できます。

于 2015-08-05T14:21:43.863 に答える