如何在Javascript中测试另一个函数的函数调用次数?

时间:2014-03-28 15:03:28

标签: javascript unit-testing qunit sinon

说我有这个功能:

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 个答案:

答案 0 :(得分:5)

你可以这样做:

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

例如:JSFiddle

答案 1 :(得分: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++

答案 2 :(得分:0)

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

你无法监视doSomethingElse。

doSomethingElse是不可测试的,当某些东西不可测试时,需要重构。

你需要在doSomething中注入doSomethingElse

OR

使用指针:

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

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

答案 3 :(得分: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(arguments.callee),就可以更轻松地调试所需的任何函数。

答案 4 :(得分:0)

在Node.js 14.2.0中,无需使用Sinon或其他其他库,就可以使用新的实验CallTracker API来完成这项工作。

var assert = require('assert');

test("Testing something", function () {
    var originalDoSomethingElse = doSomethingElse;
    var tracker = new assert.CallTracker();
    doSomethingElse = tracker.calls(doSomethingElse, 12);
    try {
        doSomething(12);
        tracker.verify();
    } finally {
        doSomethingElse = originalDoSomethingElse;
    }
});