2014-03-28 68 views
2

說我有這個功能:如何測試Javascript中另一個函數的函數調用次數?

function doSomething(n) { 
    for (var i = 0; i < n; i++) { 
     doSomethingElse(); 
    } 
} 

我將如何測試是否doSomethingElse函數被調用n次?

我想是這樣的:

test("Testing something", function() { 
    var spy = sinon.spy(doSomethingElse); 

    doSomething(12); 

    equal(spy.callCount, 12, "doSomethingElse is called 12 times"); 
}); 

但是這似乎並沒有工作,因爲你必須調用間諜而doSomething()調用原始doSomethingElse()。我怎樣才能使QUnit/sinon.js這項工作?

編輯

也許它甚至不是一個好主意?這是否屬於「單元測試」之外,因爲調用了另一個函數?

回答

5

你可以做這樣的事情:

test('example1', function() { 
    var originalDoSomethingElse = doSomethingElse; 
    doSomethingElse = sinon.spy(doSomethingElse); 
    doSomething(12); 
    strictEqual(doSomethingElse.callCount, 12); 
    doSomethingElse = originalDoSomethingElse; 
}); 

例如:JSFiddle

+0

Thanx你做了(不像其他答案)明白他們是qunit測試。我會嘗試這個! – devqon

0

聲明一個名爲count一個全局變量,併爲其分配0

window.count = 0; 

現在,doSomethingElse()函數內部,增加它像count++

所以,每當你訪問count變量,它將返回的數量乘以doSomethingElse()

的完整代碼可能是:

window.count = 0; 

function doSomething(n) { 
    for (var i = 0; i < n; i++) { 
     doSomethingElse(); 
    } 
} 

function doSomethingElse() { 
    count++; 
    // do something here 
} 

doSomething(22); 
alert(count);// alerts 22 

甚至更​​好,叫count++每當要被測試的函數被調用的代碼。

演示:http://jsfiddle.net/583ZJ/

注:如果你想刪除它,然後只是刪除變量聲明(window.count=0;)和count++

+0

這被稱爲重構,但最糟糕的方式。 – mpm

+0

我只想運行測試套件時的計數值,而不是運行原始代碼時的值。 – devqon

+0

@ user3153169然後你需要重構你的代碼,無論如何你都不能窺探一個閉包。不管你在某處以某種方式注入doSomethingElse()。 – mpm

0
function doSomething(n) { 
    for (var i = 0; i < n; i++) { 
     doSomethingElse(); 
    } 
} 

你doSomethingElse着間諜。

doSomethingElse不可測試,當某些東西不可測試時,需要對其進行重構。

您也需要在DoSomething的

OR

使用指針注入doSomethingElse:

pointer={doSomethingElse:function(){}}; 

function doSomething(n) { 
    for (var i = 0; i < n; i++) { 
     pointer.doSomethingElse(); 
    } 
} 
0
function debugCalls(f) { 
    if (!f.count) 
     f.count = 0; 

    f.count++; 
} 

function doSomethingElse() 
{ 
    debugCalls(arguments.callee); 


    // function code... 
} 


// usage 
for(var i = 0; i < 100; i++) doSomethingElse(); 

alert(doSomethingElse.count); 

這樣,通過插入debugCalls(參數),您可以更輕鬆地調試所需的任何函數。被調用者)在你想要保存的函數內部調用它的次數。

相關問題