我不知道如何为我的js运行这个茉莉花测试,肯定还有其他ppl有这个问题。也许我做错了,也许是不可能的 - 我没有找到任何提示。问题与之 - 在jQuery - $(此)中的事实不如例如所选择的元素。$(“#this-id”):

javascript:

[..]
$("#button-id").on("click", function(e) { callSomeFunctionWith( $(this) ); } );
.

Jasmine-test(CoffeeScript):

[..]
spyOn some.object, "callSomeFunctionWith"
spyOnEvent( $("#button-id"), 'click' )

$("#button-id").trigger( "click" )
expect( some.object.callSomeFunctionWith ).toHaveBeenCalledWith( $("#button-id") )
. 遗憾的是,此测试失败(具有在我的茉莉花测试中首先将REF存储在变量中的任何变化),因为函数未以$调用(“#button-id”),但转而用$调用$(这个)和$(这)!= $(“#uch-id”)。

有人能告诉我如何完成这个测试吗?我很迷茫。甚至 remy sharp的jquery和$(这) didn'进一步得到我。

有帮助吗?

解决方案

Ok, now I've got the solution to my problem. The solution is easy, the explanation not. I'll explain the solution from scratch.

This is my Javascript code with jQuery that I want to test using jasmine-jquery:

$( "input.toggler" ).on( "click", function( e ) {
  [...]
  doSomethingWith( $(this) );
} );

And now using Jasmine-jQuery I want to ensure that the JS function "doSomethingWith" gets called with the correct "$(this)".

First one might think that $(this) === $( "input.toggler" ), but that is not true. Inside the callback function of the click handler, the $(this) jQuery uses is neither the jQuery object $( "input.toggler" ) nor the DOM element referenced by that object. As Remy Sharp explains in his really nice article "jQuery's this: demystified", the "this" inside the callback function is the DOM element, but $(this) creates a jQuery object from that DOM element. And that is not identical to the jQuery object $( "input.toggler" ).

So if you want to test this with Jasmine using the function "toHaveBeenCalledWith", you have to first extract the DOM element using either document.getElementById(...) or else document.getElementsByTagName(...)[INDEX] (where INDEX is the index of the element you want, since the latter function gives you an array of DOM elements), which is plain old Javascript. Then, when you have extracted the DOM element wanted, you have to create a jQuery-object from it by enclosing it in $( and ).

My passing Jasmine-jQuery-test finally looks something like this (using 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 ) )

So the "$(this)" from my Javascript code translates to "$(DOM_input_element)" in my Jasmine-jQuery test.

Hopefully this helps you with your projects! It took me quite a while to figure this out.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top