2017-08-24 5 views
2

でAJAX呼び出しをスタブ化:私のテストファイルでモカテスト、私は次のようになりますjqueryのAJAX呼び出し持っ.then

$.ajax({ 
    type: "GET", 
    dataType: 'json', 
    data: data, 
    url: url 
}).then((data, successFlag, xhr) => { 
    this.props.someFunc(data) 
}) 

を、私はjqueryのAJAX呼び出しがsinonでスタブアウトし、それ持っています

sinon.stub($, 'ajax') 
    .returns(Promise.resolve({ data: 'test data' })) 

また私はsomeFunc(データ)関数を覗いています。私のテストでは、ajax呼び出しを行い、someFunc(データ)が呼び出されることを期待する関数を呼び出しています。しかし、期待は失敗しますが、私は私のsomeFunc(データ)関数でコンソールログを置くとき、私はそれがはっきりと呼ばれていることがわかります。

component.instance().makeAjaxCall() 
expect($.ajax.calledOnce).to.be.true // passes 
expect(someFuncSpy.calledOnce).to.be.true // fails 

今、私はそれを前に期待をチェックしていますので、それが失敗だと仮定します。そして実行し、私は約束してテストを扱ういくつかの解決策を探してみましたが、これまでに試したことは何もありませんでした(または私は間違って実装しています)。期待をチェックする前に、.thenが実行を終了していることを確認する方法はありますか?

答えて

0

あなたはajax Promiseに「登録」して、thenブロックに期待してください。

そのような何か、

約束はマイクロタスクキューにコールバックを登録し、それは次の目盛り上で実行してしまったので、それはあなたのために働いていない
component.instance().makeAjaxCall().then(() => { 
    expect($.ajax.calledOnce).to.be.true; 
    expect(someFuncSpy.calledOnce).to.be.true; 
}); 

+0

申し訳ありませんが曖昧ですが、問題は私のmakeAjaxCall()が約束を返さないということです。 ajax呼び出しを行うことはmakeAjaxCall()関数の一部に過ぎません。そのため、私は関数をチェーン化できません。 – Andrew

+0

したがって、setTimeoutなどを介して次のイベントの表示に期待することを除いて、約束を待つクリーンな方法はありません。 – felixmosh

0

は、sinonの優れたモックutilsのsinon.createFakeServer();http://sinonjs.org/releases/v4.1.2/fake-xhr-and-server/

セットアップのテストのためのモックと偽のサーバを入力関数を呼び出し、期待をチェックし、応答するために偽のサーバーに伝えます。この場合

、のようなもの:

it('should call someFunc with the expected data', function() { 
    var server = sinon.createFakeServer(); 
    server.respondWith("GET", "*", 
      [200, { "Content-Type": "application/json" }, 
      '[{ "id": 12, "comment": "Hey there" }]']); 
    var comp = component.instance(); 
    var testStub = sinon.stub(comp.props, 'someFunc'); 
    comp.makeAjaxCall(); 
    this.server.respond(); 

    expect(testStub.calledOnce).to.be.true; // You should consider the sinon-chai package for nicer assertion debugging 
    testStub.restore(); 
    server.restore(); 
} 
個人的に

は、私は例えば(それはより多くのテスト可能見つけると、代わりに嘲笑の依存関係に渡すことができることが好き格納し、コンストラクタに$アヤックスを渡します。インスタンス上のajaxServiceパラメータとして)。

関連する問題