如何在unit testing中调用$(document).ready(function(){})

我在unit testing中尝试调用document.ready(function(){})时遇到了困难。 假设我的javascript文件中有多个,其中一个在命名函数内部调用即

function myFunction() { $(document).ready(function() { //... }); } 

我如何在unit testing中实际调用它们,以便我可以实际测试它们? 我正在使用JsTestDriver对我的javascripts进行unit testing。

谢谢。

如果是unit testing,我猜你在给定某些输入时检查function输出?

这是我的意见:

您应该准备调用document.ready的情况和不调用document.ready的情况。

因此,您的unit testing应该运行每个函数两次 – 一次模拟预先准备好的呼叫,一次模拟后就绪呼叫。 也就是说,你应该有一个run-through,其中发生在document.ready DOES上运行的任何东西,以及一个只是被忽略的run-through(可能在生命周期中稍后调用)。

编辑:重新阅读问题,并了解它多一点。 您可以覆盖$(document).ready来执行您想要的操作(不是等待DOMLoaded事件触发,而是立即运行函数)。 这个代码片段将用一个完全相同的函数替换$(document).ready函数。 它应该在任何unit testing之前运行。

 var postReady = true; // or false to ignore the function calls. jQuery.fn.ready = function(fn) { if(postReady && fn) fn(); } 

示例测试用例:

 whatever     

你知道document.ready...工作原理就是从调用其中的函数开始。 理想情况下,如果你只有一个由ready函数调用的init函数,那么你调用一个函数,它可以满足你的需要,你可以继续进行测试。

你可以把unit testing放得太远,在这种情况下你需要问自己你在测试什么,以及为什么。 JQuery document.ready函数可以工作,并且运行良好(你知道这是因为它已被许多人测试过)。

我会假设诀窍是,而不是创建一个匿名函数,命名一个,并使用它。

 //So instead of this... $(document).ready(function() {...}); //Do the following $(document).ready(my_function); 

然后你只需测试my_function并确保它正常工作。 确保按照要加载的顺序测试function以进行准确测试。

我建议你重构一下代码。 即使你找到了一种方法来调用它,对其他开发人员来说也很难理解。

另外(恕我直言,我不太确定)你必须在触发页面就绪事件后调用就绪处理程序,因为如果你“安装”ready()处理程序,如果document.ready事件已经触发,则jquery调用该处理程序立即(所以它永远不会丢失该事件,即使你的代码添加了一个处理程序太晚 – 也就是说,在document.ready仍然完成之后)。

你不能只创建一个用户my_on_read()事件吗? 或类似的东西?

好吧,最后,请关注ready.ready()已经完成后安装的ready()事件和处理程序:)

这个问题的部分答案可以在这里找到。

以下是基于以上答案回答此问题的示例代码:

 myFunction(); $.readyList[1](); 

索引假定源文件中只有1个document.ready函数。 索引0指的是我认为是浏览器信息的其他内容。