2015-10-05 85 views
0

隨着興農的功能,我想窺探從一個函數在我qunit測試一個異步函數調用:QUnit&sinon。刺探一個異步調用

test("requestLiveCategoriesData should call parseCategoriesData", function(){ 
     var spy = sinon.spy(this.liveCategoriesModel, 'parseCategoriesData'); 
     this.liveCategoriesModel.requestLiveCategoriesData(); 
     sinon.assert.calledOnce(spy); 
    }); 

測試失敗(expected parseCategoriesData to be called once but was called 0 times)即使parseCategoriesData確實被調用由requestLiveCategoriesData - 我知道這是因爲parseCategoriesData called輸出到控制檯當我在瀏覽器

此運行測試我測試的代碼(簡化問題的緣故):

requestLiveCategoriesData: function() { 
    console.log('getting live categories'); 
    try { 
     console.log("--- RETRIEVING LIVE CATEGORIES EVENTS ---"); 

     liveCategoriesCall = new LiveEventRequest(eventObjRequest); 
     liveCategoriesCall.on('reset', this.parseCategoriesData, this); //the spied on function is called from here 
     liveCategoriesCall.fetch({ 
      success: function (collection, resp, options) { 
       console.log('Live Categories Events Request complete.'); 
      }, 
      error: function(collection, resp) { 
       console.log("Error on Live Categories Events Request"); 
       if (_.has(resp, 'statusText') && resp.statusText === "timeout") { 
        /* Timeout error handling */ 
        console.log("Live Categories Events Request Timeout"); 
       } 
       Conf.generalNetworkError(); 
      }, 
      complete: function (resp, textStatus) { 
       console.log("Live Categories Request teardown."); 
       if (liveCategoriesCall) { liveCategoriesCall.off('reset', that.parseCategoriesData, that); } 
      }, 
      cache:false, 
      timeout: that.get('liveEventsTimeout') 
     }); 

    } catch(err) { 
     console.log("ERROR: PROCESSING LIVE CATEGORIES"); 
     console.log(err.message); 
     console.log(err.stack); 
     if (liveCategoriesCall) { liveCategoriesCall.off('reset', this.parseEventsData, this); } 
     this.set({ 
      'lastRequest': (new Date()).getTime(), 
      'liveCategories': [] 
     }); 
     this.trigger("errorAPI", err.message); 
    } 
},  


parseCategoriesData: function (liveCategoriesCall) { 
    console.log('parseCategoriesData called'); 
}, 

我正在以正確的方式來解決這個問題嗎?

回答

0

您至少需要指示QUnit使用async()等待異步響應呼叫。

現在,當您設置好後,您需要確定何時可以撥打sinon.assert.calledOnce(spy);。看起來目前沒有辦法知道LiveEventRequest何時返回數據。

如果您無法使用setTimeout修改當前代碼以等待一點,那麼這是您唯一的(壞)選項。

如果您可以更改代碼,您應該調查是否可以從requestLiveCategoriesData呼叫中返回承諾。當數據到達時有承諾解決。然後,您可以在執行Sinon檢查之前等待該承諾,然後按照QUnit異步文檔中的done()調用進行跟蹤。

雖然我們在這樣做:您可能應該使用sinon fakeserver或其他方式來模擬LiveEventRequest的結果。