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