好吧,現在我已經解決了我的問題。解決方案很簡單,解釋不了。我將從頭開始解釋解決方案。
這是我的Javascript代碼使用jQuery,我想測試使用茉莉花的jQuery:
$("input.toggler").on("click", function(e) {
[...]
doSomethingWith($(this));
});
現在用茉莉花,jQuery的我想確保JS功能「doSomethingWith」被稱爲與正確的「$(本)」。
第一個人可能會認爲$(this)=== $(「input.toggler」),但事實並非如此。 在click處理函數的回調函數中,$(this)jQuery使用的既不是jQuery對象$(「input.toggler」),也不是該對象引用的DOM元素。 正如Remy Sharp在他的非常好的文章「jQuery's this: demystified」中解釋的,回調函數中的「this」是DOM元素,但是$(this)從該DOM元素創建了一個jQuery對象。這與jQuery對象$(「input.toggler」)不一樣。所以如果你想用Jasmine使用函數「toHaveBeenCalledWith」來測試這個,你必須首先使用document.getElementById(...)或者document.getElementsByTagName(...)[INDEX ](其中INDEX是你想要的元素的索引,因爲後一個函數給你一個DOM元素數組),這是一個普通的舊Javascript。 然後,當你提取了想要的DOM元素時,你必須通過將它包含在$(和)中來創建一個jQuery對象。
我路過茉莉花jQuery的測試終於看起來像這樣(使用CoffeeScript的):
it "does something with my input element", ->
DOM_input_element = document.getElementsByTagName("input")[0] # Choose the correct DOM element here
spyOn myobject.functions, "doSomethingWith"
spyOnEvent($('input.toggler'), 'click')
[...]
$('input.toggler').trigger('click')
# Check for changes after click:
expect(myobject.functions.doSomethingWith).toHaveBeenCalledWith($(DOM_input_element))
所以 「$(本)」 從我的Javascript代碼轉換爲 「$(DOM_input_element)」 在我Jasmine-jQuery測試。
希望這可以幫助您與您的項目!我花了很長時間才弄明白這一點。