如何在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);