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

Ber*_*Cim 5 javascript jquery unit-testing

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

function myFunction() {
    $(document).ready(function() {
        //...
    });
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Ada*_*m A 6

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

这是我的意见:

您应该准备调用document.ready的情况和不调用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();
}
Run Code Online (Sandbox Code Playgroud)

示例测试用例:

<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>
Run Code Online (Sandbox Code Playgroud)


Jam*_*ack 5

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


Mil*_*OSS 5

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

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

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

//Do the following
$(document).ready(my_function);
Run Code Online (Sandbox Code Playgroud)

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


Ber*_*Cim 0

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

下面是根据上述答案回答这个问题的示例代码:

myFunction();
$.readyList[1]();
Run Code Online (Sandbox Code Playgroud)

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