2011-12-20 2 views
1

У меня есть два вопроса:Как лучше всего провести тестирование абстракции событий?

1.) Как лучше всего провести тестирование при прослушивании событий? 2.) Правильно ли я понял isHostMethod?

Я пытаюсь выполнить unit-test абстракцию прослушивателя событий, но единственный способ, с помощью которого я могу проверить его, - это событие «загрузка» окна.

Я пример кода здесь: https://gist.github.com/1502326

Кроме того, я использую Дэвид Марк (@cinsoft) isHostMethod обнаружить соответствующую поддержку объекта хоста, но было интересно, если я правильно понял, понятия или нет? Так, например, я прав, полагая, что объект хоста/метод должен быть доступен в следующих условиях (хотя я понимаю, что эти «условия» недостоверны):

  • если TYPEOF возвращает «функция» (для большинства браузеры)
  • если TYPEOF возвращает «неизвестная» (для IE < 9, где его реализация используемых объектов ActiveX для собственных функций)
  • если TYPEOF возвращает «объект», а значение не является «нулевым» (потому что ES3 данные позволили null для возврата «объекта», который является неправильным поведением)

Если какое-либо из этих условий истинно, то (опять же, неправомерно) должно означать, что указанный метод узла доступен для использования.

Но даже объект-объект хоста может быть реализован по-разному так, как это специфицирует спецификация, и поэтому было бы более точно выполнить полное «обнаружение функции», где я создаю объект и посмотреть, вызвано ли событие (или какой-либо аналогичный тест)?

Благодарим за любой совет, касающийся обоих этих вопросов.

+1

Код не может существовать без контекста. То, что вы называете абстракцией, - это 3 разные функции, сопоставленные с тем же именем в зависимости от среды. И, как вы знаете, эти альтернативы делают разные вещи (порядок выполнения, «это», несколько слушателей), и они будут продолжать делать это, даже если вы тщательно проверяете их существование. – galambalazs

ответ

0

Самый простой способ - использовать синтетическое событие click. Учитывая код в вашей сущности, вы можете проверить с:

var evt; 

events.add(document.body, "click", function() { 
    // swap this for an assert(true, "message"); 
    console.log(true, "supported"); 
}); 

// IE nodes support a click() method 
if (document.body.click) { 
    document.body.click(); 
} else { 
// Standards based events have to be created, initialized and dispatched.  

    evt = document.createEvent("MouseEvents"); 
    evt.initMouseEvent( 
     "click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null 
); 

    document.body.dispatchEvent(evt); 
} 

См: http://jsfiddle.net/rwaldron/CR4FC/

Испытано в: IE6,7,8; Chrome 17; Firefox 10; Safari 5.1.2; Opera 11