即时更改Javascript参数

时间:2013-10-16 18:13:59

标签: javascript node.js unit-testing mocha

我正在使用Mocha为我的Node.js应用程序编写单元测试。由于我的测试包含了大量冗余assert.equal(someFunction(arg1, arg2, arg3...), expected);,我想做了类似的事情:

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而不是每次传递参数?

2 个答案:

答案 0 :(得分:2)

只需让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)

* 更新* 使用范围变量进行与上述相同的测试     var arg1 = 4,arg2 = 5,result = 15; //一些随机范围变量     function somefunc(){         return arg1 * 5 - arg2};     }

//same test and results as above
var func = assertEqual(somefunc, result);
func();
arg1 = 2;
arg2 = 8;
func();

答案 1 :(得分:0)

在我看来,您可以将变量设为全局变量,而不是将它们作为参数传递给函数,您可以从代码中的任何位置设置/引用它们。

编辑: 在您的示例中,参数实际上是全局的,只需将它们视为而不是参数。