反正是否有函数中定义的单元测试javascript函数?

时间:2009-12-21 22:39:11

标签: javascript jquery unit-testing

我想问一下,我是否能够在document.ready中对ExternalFunction内部的代码进行单元测试?我已经尝试了很多东西了一段时间,仍然无法弄清楚如何,并且我的智慧结束了。

$(document).ready(function () {
    var originalExternalFunction = ExternalFunction;
    ExternalFunction = function(context, param) {
        // trying to unit test the stuff in here!
    }
}

我是使用JsTestDriver进行单元测试的。测试声明类似于TestThisTest.prototype.test_this - function(){};

提前致谢。

4 个答案:

答案 0 :(得分:2)

因为,在您的示例中,ExternalFunction未在函数范围内声明,所以它是全局的(或者至少在它可能在外部ready中定义的任何范围内)。因此,您可以通过将其称为全局来测试它。

问题是,为了将功能分配给ExternalFunction,您必须运行ready(如果需要,可以手动运行)。这意味着如果您在ready中放置任何其他功能,那么不,它不是单元可测试的。如果您的示例代码是对现实的准确反映,那么我认为它有点可测试。

这样的构造的要点是隐藏内部函数。如果你不想隐藏它,那么Anon。建议在更容易理解的范围内定义newExternalFunction就是你需要的。

如果您的函数需要使用ready内的变量进行闭包,则可以定义newExternalFunction:

   var newExternalFunction;
    $(document).ready(function () {
        var originalExternalFunction = ExternalFunction;
        newExternalFunction = function(context, param) {
            // trying to unit test the stuff in here!
        }
        ExternalFunction = newExternalFunction;
    }

在单元测试之前,您仍需确保ready已运行,但您不必依赖ExternalFunction未重置为originalExternalFunction

答案 1 :(得分:1)

您可以执行以下操作:

function newExternalFunction(context, param) {
    //etc.
}

$(document).ready(function () {
    var originalExternalFunction = ExternalFunction;
    ExternalFunction = newExternalFunction;
}

然后在newExternalFunction上运行单元测试相对简单。

答案 2 :(得分:0)

理论上,你可以这样做:

ExternalFunction = function() { }
ExecuteDocumentReady(); // implement a mock on $(document).ready(fn) to store the function, and then execute it here

ExternalFunction(fakeContext, fakeParam);
assert(fakeContext.foo == 12); // or whatever you need it to do

话虽如此,我不确定如何在javascript中做到这一点。

答案 3 :(得分:0)

您可以使用闭包来生成回调函数:

// create function to make your "extension" function
function createHookFunction(callback) {
  // return a function 
  return function(context, param) {
     var ret;
     // // trying to unit test the stuff in here!


     if (typeof callback == 'function') {
       // if you want to trap the return value from callback, 
       // ret = callback.apply(...);
       callback.apply(this, arguments);
     }
     return ret;
  };
}

// your hook now becomes:
$(document).ready(function() {
  ExternalFunction = createHookFunction(ExternalFunction);
});

// and your unit test becomes:
var funcToTest = createHookFunction();
funcToTest(testContext, testParam);

// And, you could even test that the callback itself gets called

function someTest() {
  var testContext = {}, testParam='test';
  var callbackCalled = false;
  var funcToTest = createHookFunction(function(context, param) {
    callbackCalled = (context === testContext) && (param === testParam);
  });
  return (funcToTest(testContext, testParam) == 'Expected Return') && callbackCalled;
}