Javascript 如何在单元测试中调用$(document).ready(function(){})
我在单元测试中尝试调用document.ready(function(){})时遇到困难。假设我的javascript文件中有多个,其中一个在命名函数中调用,即Javascript 如何在单元测试中调用$(document).ready(function(){}),javascript,jquery,unit-testing,Javascript,Jquery,Unit Testing,我在单元测试中尝试调用document.ready(function(){})时遇到困难。假设我的javascript文件中有多个,其中一个在命名函数中调用,即 function myFunction() { $(document).ready(function() { //... }); } 我如何在单元测试中实际调用它们,以便能够实际测试它们?我正在使用JsTestDriver对我的Java脚本进行单元测试 谢谢。您知道文档。准备好了吗…可以工作,所以只需从
function myFunction() {
$(document).ready(function() {
//...
});
}
我如何在单元测试中实际调用它们,以便能够实际测试它们?我正在使用JsTestDriver对我的Java脚本进行单元测试
谢谢。您知道
文档。准备好了吗…
可以工作,所以只需从调用其中的函数开始。理想情况下,如果ready函数只调用了一个init
函数,那么您可以调用一个函数,它可以执行您需要的操作,您可以继续测试。我建议您重构代码。即使您找到了一种调用它的方法,其他开发人员也很难理解它
另外(IMHO,我不太确定)即使在触发pages ready事件之后,也必须调用ready处理程序,因为如果“安装”ready()处理程序,如果document.ready事件已经触发,jquery会立即调用该处理程序(所以它永远不会丢失该事件,即使您的代码添加处理程序太晚——也就是说,在document.ready仍然完成之后)
你不能创建一个用户my_on_read()事件吗?或者类似的事件
好的,最后,请注意ready()事件和处理程序,它们将在document.ready()完成后安装:)如果这是一个单元测试,我猜您会在给定特定输入时检查函数输出吗 以下是我的看法: 您应该为调用document.ready和未调用document.ready的情况做好准备 因此,您的单元测试应该运行每个函数两次——一次模拟准备就绪前的调用,一次模拟准备就绪后的调用。也就是说,您应该在document.ready上发生的任何事情都会运行的地方运行一次,在忽略它的地方运行一次(可能会在生命周期的后面调用) 编辑: 只需重新阅读问题,并进一步理解它。您可以重写$(document)。准备好执行您希望它执行的操作(这不是等待触发DOMLoad事件,而是立即运行函数)。此代码段将用一个函数来替换$(document).ready函数。它应该在任何单元测试之前运行
var postReady = true; // or false to ignore the function calls.
jQuery.fn.ready = function(fn)
{
if(postReady && fn) fn();
}
示例测试用例:
<html><head><title>whatever</title>
<script type="text/javascript" src="/JS/jquery-1.3.2.js"></script>
<script type="text/javascript">
var postReady = true; // or false to ignore the function calls.
jQuery.fn.ready = function(fn)
{
alert("We stole ready!");
if(postReady && fn) fn();
}
$(document).ready(function()
{
alert("The function is called.");
});
</script>
</head><body></body>
</html>
不管怎样
var postReady=true;//或false忽略函数调用。
jQuery.fn.ready=函数(fn)
{
警惕(“我们偷东西准备好了!”);
if(postReady&&fn)fn();
}
$(文档).ready(函数()
{
警报(“函数被调用”);
});
单元测试可能走得太远了,在这种情况下,您需要问问自己您正在测试什么,以及为什么。JQuery document.ready函数运行良好(您知道这一点,因为它已经过很多人的测试) 我假设技巧是命名一个匿名函数并使用它,而不是创建一个匿名函数
//So instead of this...
$(document).ready(function() {...});
//Do the following
$(document).ready(my_function);
然后,您只需测试我的_函数并确保它正常工作。确保按照加载函数的顺序测试函数,以便进行准确的测试。可以找到此问题的部分答案 以下是基于上述答案回答此问题的示例代码:
myFunction();
$.readyList[1]();
该索引假定源文件中只有一个document.ready函数。索引0指的是我认为是浏览器上信息的其他内容。另一个需要仔细考虑的设计细节:当处理程序发生“添加”时,您真的能够始终复制吗?在这个例子中,它意味着“myFunction”总是在这个或那个页面上被调用吗?您(或其他开发人员)必须解释此函数将安装一个就绪的处理程序-不明显!我认为在“非全局”代码中添加就绪处理程序没有任何价值。。好的,只需在全局代码中添加就绪处理程序,并将全局代码移动到中心位置。我相信,这会让你的问题过时。看起来你在应用程序中发现了一个主要的设计缺陷…@Adam a:谢谢。我尝试过类似的方法,但没有成功。我并不是要证明document.ready是否有效,而是它里面的代码。我很难从单元测试中调用它。我使用的是JsTestDriver,它似乎没有加载任何document.ready函数,不管我是否将其放在命名函数下。我试着推迟,窗口加载,打电话等等。。。但它只是没有响应。我尝试了我给出的代码片段,它似乎起了作用。它所做的是重写jQuery的document.ready函数,因为domloadded事件不会在单元测试中触发,这意味着document.ready永远不会运行。该代码段使document.ready独立于domload事件。如果我们处于post-domload状态(由postReady变量确定),则立即调用传递给document.ready的函数。如果我们处于预加载状态,则忽略document.ready将调用的任何函数(并确保该函数仍然执行它所需的操作)。@Adam a:我尝试使用完全相同的代码段运行测试,单独运行测试,并在代码中只保留1个document.ready函数(我有几个)。不幸的是,什么也没发生(我在第一行有警报,它根本没有弹出)。我想不出我遗漏了什么或错了什么。用我试过的方法编辑了我的答案。如果让我猜你的问题是什么,我会说也许jquery包含在代码片段之后?我想这可能会导致。准备好用原始函数调用再次覆盖。也许您可以针对最后包含代码片段的jquery文件进行单元测试。这样,它将始终覆盖原始实现。我马上将我的快速测试示例添加到这个答案中