动态更改Javascript参数
我正在使用Mocha为Node.js应用程序编写单元测试。因为我的测试包含了大量冗余的动态更改Javascript参数,javascript,node.js,unit-testing,mocha.js,Javascript,Node.js,Unit Testing,Mocha.js,我正在使用Mocha为Node.js应用程序编写单元测试。因为我的测试包含了大量冗余的assert.equal(someFunction(arg1、arg2、arg3…),应该是这样的),我想做这样的事情: var assertEqual = function(func, result) { assert.equal(func, result); } descrirbe('someFunction()', function() { var arg1 = ... var ar
assert.equal(someFunction(arg1、arg2、arg3…),应该是这样的)代码>,我想做这样的事情:
var assertEqual = function(func, result)
{
assert.equal(func, result);
}
descrirbe('someFunction()', function() {
var arg1 = ...
var arg2 = ...
var func = someFunction;
assertEqual(func, result)
arg1 = ...
arg2 = ...
assertEqual(func, result);
}
这显然不起作用,因为func
在声明时将绑定其参数。有没有办法在Javascript中通过引用传递这些参数,这样我就可以不断修改它们并调用func
,而不是每次都传递参数?在我看来,您可以将变量设置为全局变量,而不是将它们作为参数传递给函数,您可以在代码中的任何位置设置/引用它们
编辑:
在您的示例中,参数实际上是全局的,只需将其视为全局参数而不是参数。只需使assertEqual返回一个函数,并使该函数成为您所调用的函数而不是func:
function assertEqual(func, expected) {
return function() {
var result = func.apply(this, arguments);//result if you called the old function normally
assert.equal(result, expected);//pass/fail test
return result; //return the result
}
}
var func = assertEqual(oldfunc, result);
func(arg1, arg2);
func(arg3, arg4);
//example:
var func = assertEqual(function(a,b) {return a*5 - b}, 15);
func(4, 5); //=> 15, calls assert.equal(15, 15)
func(2, 8); //=> 5, calls assert.equal(5, 15)
*更新*
使用范围变量进行与上述相同的测试
变量arg1=4,arg2=5,结果=15//一些随机范围变量
函数somefunc(){
返回arg1*5-arg2};
}
我怎样才能通过在beforevar func=
下设置它们,用func的不同参数再次调用这个函数?这将正常调用原始函数(例如,如果oldfunc=function(a,b){return a==b}和func=assertEqual(oldfunc,false),调用func(4,5)调用assert.equal(true,false)但我每次都需要用新参数重置oldfunc。这完全违背了我的目的,因为我也可以调用函数的参数并将其传递给assert.equal
。我想定义一个函数,设置哪些变量是它的参数,当我更改这些变量时,函数中的参数会更改(有点像通过引用传递),而不是用新参数重新定义函数。这有意义吗?看看我上面的代码。我再次调用assertEqual
,并重置参数,而不重新定义func
是什么。认为这应该适合你所寻找的。如果你想改变预期,你会看到很多丑陋的东西。我可以想到的两种方法是使函数的结果达到预期效果,或者在非本地的范围内根据需要使用assertEqual。它们位于descripe()
函数中。您将传递什么给func?在assert.equal上,它应该是func()而不是func
//same test and results as above
var func = assertEqual(somefunc, result);
func();
arg1 = 2;
arg2 = 8;
func();