2017-08-24 71 views
2

我有一個jquery Ajax調用看起來是這樣的:摩卡測試存根Ajax調用了。然後

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

在我的測試文件,我有jQuery的AJAX調用存根與興農和它用數據返回已解決的承諾:

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

輸入興農出色的嘲諷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參數)。