好吧,现在我已经解决了我的问题。解决方案很简单,解释不了。我将从头开始解释解决方案。
这是我的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测试。
希望这可以帮助您与您的项目!我花了很长时间才弄明白这一点。