Как проверить количество вызовов функции другой функции в 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?

РЕДАКТИРОВАТЬ

Может быть, это даже не хорошая идея? Это выходит за рамки "модульного тестирования", потому что вызывается другая функция?

4 ответа

Решение

Вы могли бы сделать что-то вроде этого:

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

Например: JSFiddle.

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

Вы не можете шпионить за doSomethingElse.

doSomethingElse не тестируется, когда что-то не тестируется, его необходимо реорганизовать.

Вам либо нужно ввести doSomethingElse в doSomething

ИЛИ ЖЕ

использовать указатель:

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

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

В Node.js 14.2.0 можно использовать новый экспериментальный API CallTracker для выполнения этой работы без использования Sinon или другой дополнительной библиотеки.

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;
    }
});
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) в функцию, которую вы хотите сохранить, сколько раз она была вызвана.

Объявите глобальную переменную с именем 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++

Другие вопросы по тегам