Тест на связанное событие, используя JSUnit? - PullRequest
0 голосов
/ 14 марта 2011

Как я могу проверить, что обработчик событий привязан к узлу с помощью JSUnit?

Вот что у меня есть:

var mynode = document.getElementById( "mynode" );

assertNotNull( mynode );

MyLibrary.attachEvent( mynode, "click", function( ){ return true; } );

assertEquals( typeof mynode.onclick, typeof function( ){ return true; } );

Но тип mynode.onclick:конечно, объект;в то время как тип функции ... ну ... функция.

Если я попытаюсь просто assertEquals( mynode.onclick, function( ){ return true; } );, утверждение также не будет выполнено.

Есть предложения?

Ответы [ 2 ]

1 голос
/ 17 марта 2011

помните, что свойство "onclick" не является тем же механизмом, что и addEventListener.

в вашем примере свойство mynode.onclick, вероятно, равно нулю, потому что MyLibrary.attachEvent использует метод addEventListener (стандартный совместимый) / attachEvent (IE <9). Следовательно вы тестируете: </p>

typeof mynode.onclick = typeof null = "object"

Теперь ваша проблема в том, что когда была написана спецификация DOM Level 2 Events , они забыли предоставить средство доступа к списку событий, которые в данный момент зарегистрированы на узле. Таким образом, в основном вы не можете написать модульный тест, который пытаетесь реализовать .

Спецификация DOM Level 3 Events (все еще в черновом режиме) решает проблему в 2002 году с помощью нового свойства элементов: eventListenerList

К сожалению, в текущем проекте, похоже, это свойство удалено, и я не думаю, что вы найдете браузер, реализующий его.

Я смог найти только Firefox 3.6 , реализующий метод getListenerInfoFor (), но, похоже, он доступен только в режиме chrome / XUL, поэтому он не поможет.

вы могли бы либо

  • дождаться, пока eventListenerList будет реализован во всех браузерах; -)
  • верьте, что MyLibrary правильно добавляет событие
  • добавить поддельное событие с тестовым кодом внутри функции обратного вызова и отправить событие click для элемента

Надеюсь, это поможет вам

Джером Вагнер

1 голос
/ 17 марта 2011

Я не знаю JSUnit, но как насчет использования toString()?

assertEquals(mynode.onclick.toString(), "function( ){ return true; }");

Конечно, есть проблема с равенством строк.Но, приложив немного усилий, вы сможете избавиться от всех пробелов в этих двух строках и сравнивать их без табуляции, пробелов и переносов ...

Не думаю, что вы можете сравнивать методы / функции вJavaScript.Если вы хотите сравнить две функции, вы фактически сравниваете их ссылки.Это означает, что если вы указали даже одну и ту же функцию в другом месте кода, она будет считаться другой функцией (с другим адресом).

Проверьте это для получения дополнительной информации о равенстве Операторы строгого равенства

РЕДАКТИРОВАТЬ: вы можете попытаться написать тест таким образом, но все еще есть возможность получить false:

var myHandler = function() { return true; };
MyLibrary.attachEvent( mynode, "click", myHandler);
assertEquals(mynode.onclick, myHandler);

, поскольку вы используете точно такую ​​же функцию,который имеет одинаковую ссылку в обоих случаях вы используете его.Однако вы должны быть осторожны с тем, что MyLibrary.attachEvent делает с переданной ссылкой на myHandler (например, копирует ли она? Расширяет? Просто сохраняет ссылку? ...)

...