我想问一下,我是否能够在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(){};
提前致谢。
答案 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;
}