2014-08-29 48 views
0

我試圖把一個小例子展示給同事,但不知道這個測試that I've put in a gist有什麼問題。這個單元測試異步JavaScript函數(通過Mocha/Sinon)有什麼問題?

基本上我想測試做了異步功能,但使用興農的間諜()功能,以確保它完成:採用摩卡和done()來解決一個測試,依賴於

function asyncHello(name, delay, cb) { 
    setTimeout(function() { 
    console.log("running after ", delay); 
    cb("hello " + name); 
    }, delay); 
} 



suite('Mega Suite', function(){ 

    suite("testing async hello", function() { 
    test('should call the callback', function(done) { 
     var cb = sinon.spy(); 
     asyncHello("foo", cb); 

     cb.should.have.been.called(); 
     done(); 
    }); 
    }); 
}); 

思想異步函數(setTimeout,在這種情況下)可以工作,但也許有人可以指出我錯在哪裏。謝謝!

回答

0

你不需要興農此:

function asyncHello(name, delay, cb) { 
    setTimeout(function() { 
    console.log("running after ", delay); 
    cb("hello " + name); 
    }, delay); 
} 

suite('Mega Suite', function(){ 
    suite("testing async hello", function() { 
    test('should call the callback', function(done) { 
     asyncHello("foo", 1000, function() { 
     done(); 
     }); 
    }); 
    }); 
}); 

有兩個問題在此代碼:

  1. 你叫asyncHello("foo", cb);這使得它讓你在函數內部delay論據是設置爲cb,函數內部的cb參數未定義。

  2. 即使在確定第一項之後cb.should.have.been.called();在傳遞給setTimeout的函數可以執行之前被調用。

    你基本上不需要使用Sinon,因爲如果你只是設置一個回調來呼叫done()那麼你就知道測試是成功的。如果任何地方出現問題,done()將不會被調用,並且測試將失敗。

+0

是的,我的部分是愚蠢的錯誤。感謝您指出了這一點。 :) 關於不使用Sinon的注意事項,但是如果我想窺探一個將進行異步調用的函數,那麼使用Sinon的「正確」方法是什麼? 我正在考慮像集成測試這樣的事情,我想確保一個模塊在給定情況下(即緩存未命中,所以去獲取一些數據)進行正確的調用(比如說http.get())。但我可能不想在測試中一直打網絡。 – virtualandy 2014-08-31 22:12:27