2011-07-21 40 views
6

我發現使用jQuery或本地元素觸發器函數模擬實際的用戶事件越來越困難。例如,如果您有文本輸入並且您不希望用戶能夠添加角色,則可以使用​​事件中的jQuery規範化事件對象調用e.preventDefault()。但是,無法以編程方式驗證此測試場景。模擬TDD JavaScript的用戶輸入

即使沒有調用preventDefault,以下測試也會通過,因爲jQuery keydown觸發器不是「真實」事件。

input.val('test').trigger(jQuery.Event({ 
    which: 68 
}); 
expect(input).toHaveValue('test'); 

在不正確的代碼,此測試將失敗,因爲輸入應具有「TESTD」的值(圖68是關於「d」的字符代碼)。

有沒有人知道任何方法或庫來模擬real瀏覽器UI事件?

回答

4

模擬真實事件是相當複雜的。您必須首先確定您需要的事件類型,並使用document.createEvent創建它。然後調用不同的init*Event來初始化事件對象。最後,使用element.dispatchEvent將事件分派給目標對象。

+0

我試過這個,但他們keyCode和charCode一直保持爲0,儘管我在initKeyboardEvent中指定了它們。任何想法爲什麼?如果有一個圖書館可以爲A-spec瀏覽器做到這一點,那麼這將是非常棒的......如果我能克服這個障礙,可以自己寫一個。 –

+0

@MattyF這似乎是來自WebKit上游代碼的Chrome的一個[bug](https://bugs.webkit.org/show_bug.cgi?id=16735),那個由'initKeyboardEvent'初始化的事件總是有'keyCode'和'charCode'設置爲0.我想你應該參考FF而不是基於WebKit的瀏覽器。 – Ghostoy

2

你可能想使用Selenium嘗試:http://seleniumhq.org/

這裏有一個體面的概述:http://blog.frontendforce.com/2010/05/unit-testing-in-javascript-selenium/

+0

我看了一下這個昨天 - 是否有通過JavaScript使用Selenium,這樣我可以用我的自動化測試其集成的方式(JsTestDriver +茉莉花)? –

+0

我不認爲你可以一起使用它們。很多人會認爲你的JsTestDriver測試是「單元測試」,Selenium是「集成測試」。 – brendan

+0

不完全是你要找的,但也許有用:http://stackoverflow.com/questions/5091935/can-i-write-selenium-tests-in-javascript – brendan

0

我相信YUI有一些代碼可以做到這一點。下載他們的代碼並看看。我相信它被稱爲simulate.js或類似的東西。或者,你可以看看硒是如何做到的。