1

インターンで非同期コールバックを呼び出す必要がある状況を指定することは可能ですか? いくつかの XHR リクエストを連続して実行するメソッドをテストするテストがあるとします。具体的には、Strophe.connect に提供されるコールバックの実装をテストしようとしています。そのように機能し、最初の XMPP (BOSH) ハンドシェイクを処理するサーバーにいくつかの XHR 要求を送信します。

5 秒でコールバックがステータス コード 5 (接続済み) で呼び出されることをテストすることは可能ですか? 問題は、コールバックが複数回トリガーされ、正しいステータス コードを待って、他のコードを破棄する必要があることです。

var dfd = this.async(5000);

conn.connection.connect("jid", "pass", dfd.callback(function(status) {
    if(status === 5) {
        expect(status).to.have(something);
    } else {
        // here, I need to say intern to
        // do nothing, just let the callback 
        // to be triggered once more
    }
    return true;
}));
4

1 に答える 1

1

コールバックは複数回呼び出されるため、コールバックを でラップするのではなく、遅延を明示的に解決することをお勧めしますdfd.callback。次のようなことを試してください:

var dfd = this.async(5000);

conn.connection.connect('jid', 'pass', dfd.rejectOnError(function (status) {
    if (status !== 5) {
        return;
    }

    // do any assertions here

    // explicitly resolve the test since it was successful to this point
    dfd.resolve();
}));

まず、コールバックを でラップしていることに気付くでしょうdfd.rejectOnError。この便利なメソッドは、コールバック関数の実行中にエラーがスローされた場合、遅延を拒否します。次に、dfd.callbackラップされたコールバックがエラーをスローせずに実行される場合、遅延を解決しようとするため、 を削除しました。コールバックが複数回呼び出されるため、これは機能しません。条件が満たされた場合 (status !== 5およびすべてのアサーションがパスした場合) にのみ遅延オブジェクトを明示的に解決することにより、遅延オブジェクトが 5 秒以内に解決される限り、コールバックを何度でも実行できます。

于 2013-05-03T13:40:32.587 に答える