我在单元测试中尝试调用document.ready(function(){})时遇到了困难。假设我的javascript文件中有多个,其中一个在命名函数内部调用,即
function myFunction() {
$(document).ready(function() {
//...
});
}
我如何在单元测试中实际调用它们,以便我可以实际测试它们?我正在使用JsTestDriver对我的javascripts进行单元测试。
感谢。
答案 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指的是我认为是浏览器信息的其他内容。