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

时间:2009-12-03 03:09:19

标签: javascript jquery unit-testing

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

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

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

感谢。

5 个答案:

答案 0 :(得分:6)

如果是单元测试,我猜你在给定某些输入时检查功能输出?

以下是我的意见:

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

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

编辑: 只需重新阅读问题并理解它。您可以覆盖$(document).ready来执行您想要的操作(不是等待DOMLoaded事件触发,而是立即运行函数)。这个片段将用一个完全相同的函数替换$(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>

答案 1 :(得分:5)

你知道document.ready...有效,所以只需要调用其中的函数即可。理想情况下,如果你只有一个由就绪函数调用的init函数,那么你调用一个函数,它可以满足您的需要,并且可以继续进行测试。

答案 2 :(得分:5)

您可以进行单元测试,在这种情况下,您需要问问自己测试的内容以及原因。 JQuery document.ready函数可以工作,并且工作得很好(你知道这是因为它已被很多人测试过)。

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

//So instead of this...
$(document).ready(function() {...});

//Do the following
$(document).ready(my_function);

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

可以找到这个问题的部分答案here

以下是根据上述答案回答此问题的示例代码:

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

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