2009-12-03 62 views
5

我在單元測試中嘗試調用document.ready(function(){})時遇到困難。假設我有他們的多次在我的JavaScript文件,並呼籲命名函數裏面其中之一即

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

如何實際調用他們在我的單元測試,所以我可以實際測試呢?我正在使用JsTestDriver來測試我的javascripts。

謝謝。

回答

0

這個問題的答案部分可以找到here

下面是示例代碼回答基於上述回答這個問題:

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

索引假定只存在1在源文件中的document.ready功能。索引0指的是我認爲是瀏覽器信息的其他內容。

5

你知道document.ready...的作品,所以剛開始調用其中的功能。理想情況下,如果你只有一個由ready函數調用的函數init,那麼你可以調用一個函數,它可以滿足你的需求,你可以繼續進行測試。

+0

我同意這是我如何做,但大多數人可能不需要一個初始化函數。 –

0

我建議你重構代碼。即使您找到一種方法來稱呼它,其他開發人員也很難理解。因爲如果你「安裝」了ready()處理程序,如果document.ready事件已經存在,那麼即使在頁面就緒事件被觸發後,你也必須調用準備好的處理程序(因爲恕我直言,我不太確定)觸發器,jquery會立即調用該處理程序(所以它不會丟失該事件,即使您的代碼太晚添加了處理程序 - 也就是在document.ready仍然完成之後)。

難道你不能只是創建一個用戶my_on_read()事件?或者類似的東西?

好了,到了最後,請你只照顧的準備()將在的document.ready(後裝)已經完成:)

+0

有關設計的另一個細節要考慮:當處理程序的這種「添加」發生時,您是否真的可以重現?在這個例子中,它意味着,「myFunction」會在這個頁面還是那個頁面上被調用?您(或其他開發人員)必須_interprete_該函數將安裝一個準備好的處理程序 - 不是顯而易見的!在「其他全局」代碼中添加就緒處理程序時,我看不出任何價值。那麼,只需在全局代碼中添加就緒處理程序,然後將全局代碼移動到中心位置即可。我相信,這會讓你的問題過時。它看起來像你在應用程序中發現了一個主要的設計缺陷... – Frunsi

6

如果它是一個單元測試的事件和處理程序,我猜測你在給定某些輸入時檢查函數輸出嗎?

這是我的觀點:

則應針對的document.ready稱爲情況和它是不是這樣的準備。

所以你的單元測試應該運行兩個函數 - 一次是模擬一個預先準備好的呼叫,一個是模擬一個準備好後的呼叫。也就是說,您應該有一個run-through,其中發生在document.ready上的任何事情都會運行,並且只有一個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> 
+0

@亞當A:謝謝。我嘗試了類似的東西,但沒有成功。我並不是想證明document.ready是否有效,而是它裏面的代碼。我正在嘗試從我的單元測試中調用它,這讓我非常難過。我正在使用JsTestDriver,並且它似乎不會加載任何document.ready函數,無論我是否將它置於命名函數下。我試圖延遲它,window.onload,just_call_it,等等,但它只是沒有迴應。 – BeraCim

+0

我嘗試了我給的代碼片段,它似乎工作。它所做的是覆蓋jQuery的document.ready函數,因爲DOMLoaded事件不會在單元測試中觸發,這意味着document.ready將永遠不會運行。 片段使document.ready獨立於DOMLoaded事件。 如果我們處於後DOMLoaded狀態(由postReady變量確定),則立即調用傳遞給document.ready的函數。如果我們處於DOMLoaded之前的狀態,那麼只需忽略document.ready會調用的任何函數(並確保該函數仍然能夠滿足需要)。 –

+0

@亞當答:我試着運行完全相同的代碼片段,在隔離狀態下運行測試,另外在我的代碼中只留下了1個document.ready函數(我有幾個)。不幸的是沒有任何事情發生(我在第一行發現了警報,它根本沒有彈出)。我無法弄清楚我錯過了什麼或錯在哪裏。 – BeraCim

5

你可以把單元測試太遠,在這種情況下,你要問自己,你要測試什麼,以及爲什麼。 JQuery document.ready函數可以工作,並且運行良好(您知道這是因爲它已經被很多人測試過)。

我會假設技巧是,而不是創建一個匿名函數,命名一個,並使用它。

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

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

然後你只是測試my_function,並確保它工作。確保您按照將要加載的順序測試函數以進行精確測試。

相關問題