Как лучше всего протестировать абстракцию событий? - PullRequest
1 голос
/ 20 декабря 2011

У меня два вопроса:

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

Я пытаюсь провести модульное тестирование абстракции прослушивателя событий, но единственный способ проверить это - это событие окна load.

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

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

  • если typeof возвращает 'function' (для большинства браузеров)
  • если typeof возвращает значение unknown (для IE <9, где его реализация использовала объекты ActiveX для собственных функций) </li>
  • если typeof возвращает 'object' и значение не равно 'null' (поскольку спецификации ES3 позволили null возвращать 'object', что является неправильным поведением)

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

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

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

1 Ответ

0 голосов
/ 03 марта 2012

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

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;Хром 17;Firefox 10;Safari 5.1.2;Опера 11

...