说我有这个功能:
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进行此操作?
修改
也许这不是一个好主意?这是否超出了单元测试的范围。因为另一个函数被调用了吗?
答案 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++
。
注意:如果您要删除它,请删除变量声明(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;
}
});