javascript - Jasmineでは、callFake()とdone()を使用して非同期呼び出しをテストするにはどうすればよいですか?

原文 javascript testing asynchronous jasmine

非同期操作のテストにジャスミンのnew syntax (so no waits, or runs)を使用していて、問題が発生しています。
私がやろうとしていることは、モデルがsyncイベントをトリガーしたときにrender関数が確実に呼び出されるようにすることです。この例はささいなことですが、私が抱えている中心的な問題を示しています。 This answerは私のユースケースに近づきますが、私が持っていないsetTimeoutのため、最終的には異なります。
私が試したのは:
私の機能
postLoad : function() {
    this.listenTo(this.model, 'sync', this.render);
},

私のテスト
describe('postLoad', function () {

    it('listens to model sync and calls render', function (done) {
        //arrange
        view = new App.View({ model: model });
        view.initialize();
        view.postLoad();

        spyOn(view, 'render').and.callFake(function () {
            done();
        });

        //act
        view.model.trigger('sync');

        //assert
        expect(view.render.calls.count()).toBe(1);

    });
});

上記は合理的な意味でrenderには時間がかかるかもしれませんが、現在doneで理解していることから、スペックは呼び出されるまで評価されません。誰かが助けに来てくれることを願っています!レンダリングを偽装しているので、スパイでカウントされませんか?
答え
this.view.model.trigger('sync');view.renderへの呼び出しをトリガーする限り、これはうまくいくと思います。

describe('postLoad', function() {
    beforeEach(function(done) {
        this.view = new App.View({ model: model });
        spyOn(this.view, 'render').and.callFake(done);
        this.view.initialize();
        this.view.postLoad();
        this.view.model.trigger('sync');
    });
    it('listens to model sync and calls render', function() {
        expect(this.view.render.calls.count()).toBe(1);
    });
});
関連記事

javascript - 入力ボタンを持つ動的フォームを作成する

javascript - JavaScript ifステートメントで部分一致を確認する

javascript - 新しいページを読み込むときに、読み込まれたJavaScriptコンテンツをWebViewに保存する方法は?

javascript - 大きなファイルのブラウザをクラッシュさせるUint8Arrayの変換

javascript - $ .postは、$ J = jQuery.noConflict();と組み合わせて機能していません。

javascript - 選択した要素をAjaxライブ検索からテキストボックスにコピーします

javascript - JavaScriptでのオブジェクトを使用した多次元配列の並べ替え

javascript - ラチェットからスライダーを破壊/無効にする方法は?

javascript - ウェブページに最小高さを置く必要がある

javascript - React-RouterとMixinsを使用したサーバー側認証