Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中测试另一个函数的函数调用计数?_Javascript_Unit Testing_Qunit_Sinon - Fatal编程技术网

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

如何在Javascript中测试另一个函数的函数调用计数?,javascript,unit-testing,qunit,sinon,Javascript,Unit Testing,Qunit,Sinon,假设我有这个功能: function doSomething(n) { for (var i = 0; i < n; i++) { doSomethingElse(); } } 但这似乎不起作用,因为当doSomething()调用原始doSomethingElse()时,您必须调用spy。我如何使用QUnit/sinon.js实现这一点 编辑 也许这不是个好主意?这是否因为调用了另一个函数而不在“单元测试”范围内?声明一个名为count的全局变量,并将其

假设我有这个功能:

function doSomething(n) {
    for (var i = 0; i < n; i++) {
        doSomethingElse();
    }
}
但这似乎不起作用,因为当
doSomething()
调用原始
doSomethingElse()
时,您必须调用spy。我如何使用QUnit/sinon.js实现这一点

编辑


也许这不是个好主意?这是否因为调用了另一个函数而不在“单元测试”范围内?

声明一个名为
count
的全局变量,并将其赋值
0

window.count = 0;
现在,在
doSomethingElse()函数中,像
count++

function doSomething(n) {
    for (var i = 0; i < n; i++) {
        doSomethingElse();
    }
}
因此,无论何时访问
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
window.count=0;
功能剂量测定法(n){
对于(变量i=0;i
或者更好的方法是,只要在代码中调用要测试的函数,就调用
count++

演示:

注意:如果要删除它,只需删除变量声明(
window.count=0;
)和
count++
函数doSomething(n){
function doSomething(n) {
    for (var i = 0; i < n; i++) {
        doSomethingElse();
    }
}
对于(变量i=0;i
你不能监视doSomethingElse

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

你需要在doSomething中注射doSomethingElse

使用指针:

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

function doSomething(n) {
    for (var i = 0; i < n; i++) {
        pointer.doSomethingElse();
    }
}
pointer={doSomethingElse:function(){};
功能剂量测定法(n){
对于(变量i=0;i
您可以这样做:

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

函数调试调用(f){
如果(!f.count)
f、 计数=0;
f、 计数++;
}
函数doSomethingElse()
{
debugCalls(arguments.callee);
//函数代码。。。
}
//用法
对于(var i=0;i<100;i++)doSomethingElse();
警报(doSomethingElse.count);

通过这种方式,只需在要保存调用次数的函数中插入debugCalls(arguments.callee)即可轻松调试所需的任何函数。

在Node.js 14.2.0中,可以使用当前正在试验的新函数来完成这项工作,而无需使用Sinon或其他附加库

var assert=require('assert');
测试(“测试某物”,函数(){
var originalDoSomethingElse=doSomethingElse;
var tracker=new assert.CallTracker();
doSomethingElse=tracker.calls(doSomethingElse,12);
试一试{
剂量测定法(12);
tracker.verify();
}最后{
doSomethingElse=原醛体;
}
});

这称为重构,但这是最糟糕的方式。我只需要运行测试套件时的计数,而不是运行原始代码时的计数。@user3153169然后你需要重构你的代码,无论如何,你不能监视闭包。除非你以某种方式在某处注入doSomethingElse()。Thanx你做到了(与其他答案不同)明白它们是质量测试。我要试试这个!
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);