Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在单元测试中调用$(document).ready(function(){})_Javascript_Jquery_Unit Testing - Fatal编程技术网

Javascript 如何在单元测试中调用$(document).ready(function(){})

Javascript 如何在单元测试中调用$(document).ready(function(){}),javascript,jquery,unit-testing,Javascript,Jquery,Unit Testing,我在单元测试中尝试调用document.ready(function(){})时遇到困难。假设我的javascript文件中有多个,其中一个在命名函数中调用,即 function myFunction() { $(document).ready(function() { //... }); } 我如何在单元测试中实际调用它们,以便能够实际测试它们?我正在使用JsTestDriver对我的Java脚本进行单元测试 谢谢。您知道文档。准备好了吗…可以工作,所以只需从

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

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文件进行单元测试。这样,它将始终覆盖原始实现。我马上将我的快速测试示例添加到这个答案中