Тестирование событий javascript на высшем уровне

Я ищу тестовую библиотеку для javascript, которая будет работать для спецификаций пользовательского взаимодействия, таких как перетаскивание, зависания, двойные/одиночные клики и рисование на холсте. Я рассмотрел несколько библиотек, включая jspec и jasmine, но оба они, похоже, больше основаны на модульном тестировании.

Если упустить из виду тот факт, что любая из вышеупомянутых библиотек поддерживает такое тестирование, мне бы понравился пример.

Edit


Итак, я очень долго смотрел прошлой ночью и на самом деле ничего не понимал. Я бы хотел, чтобы по возможности подражать пользовательскому взаимодействию на более высоком уровне, чем что-то вроде жасмина, который является стилем capybara в том смысле, что он просто мешает взаимодействию с dom.

Мне нужна библиотека, которая на самом деле эмулирует цепочку событий mouse down → mouse move → mouse up.

Существует ли такое магическое творение?

Редактировать сообщение bounty


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

Мне не нравится, что вы должны использовать "html", а не тестировать код приложения. Это кажется обратным, если вы пытаетесь интегрировать js в свое приложение. Для тестирования спецификации это имеет смысл, но BDD-тестирование веб-фреймворка будет требовать, чтобы он фактически использовал представления приложений для тестирования.

Снова ли такой монстр существует или моя голова в облаках?

Ответ 1

Вы пробовали PhantomJS или ZombieJS? Я хорошо слышал о Phantom.

=============

Другое предложение: плагины/макросы Selenium. www.seleniumwiki.com/selenium-rc/selenium-mousedownat-mousemoveat-and-mouseupat-example/или glauche.de/2009/09/09/drag-drop-with-selenium/.

Ответ 2

Я видел единственное хорошее решение этой проблемы: DOH Robot. Он запускает java-апплет, который позволяет испускать фактические события javascript и эмулировать поведение реального пользователя (в том числе тестирование перетаскивания).

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

Ответ 3

Эмуляция поведения пользователя в JavaScript потребует создания пользовательских Event Object s, отправки их на Element и изменения их свойств, наиболее важные из которых, однако, доступны только для чтения в браузерах, совместимых со стандартами.

В IE 5+ они кажутся модифицируемыми, но это явно исключает кросс-браузерное тестирование.

Итак, я не думаю, что вы имеете в виду.


Изменить: размышляя над этим (и изучая документацию для расширения Selenium Firefox), очевидно, что вы сможете написать программу JavaScript, которая согласно заданному расписанию будет программно создавать пользовательские Event Object которые имитируют поведение пользователя.

Тем не менее, я не уверен, является ли это то, что Selenium делает или, что более важно, - это надежный способ сделать это. Асо по существу означает "faking interaction with the DOM", который вы исключили.

Btw, позвольте мне получить это правильно: так что вам по существу нужна библиотека JavaScript для тестирования части JavaScript вашего приложения; но вы также хотите, чтобы он работал на уровне браузера (а не на уровне механизма DOM), т.е. имитировать подлинное взаимодействие с пользователем, как если бы он был захвачен браузером?

Ответ 4

Я только что успешно протестировал код, который нуждался в событиях мыши, используя жасмин и jQuery.

http://api.jquery.com/category/events/event-object/

Просто создайте и активируйте такие события:

  // Create a new jQuery.Event object with specified event properties.
  var e = jQuery.Event("keydown", { keyCode: 64 });

  // trigger an artificial keydown event with keyCode 64
  jQuery("body").trigger( e );

Затем используйте Jasmine для проверки свойств. Как примечание, если вам нужно проверить анимацию, вы можете высмеивать время следующим образом:

//http://groups.google.com/group/jasmine-js/browse_thread/thread/dbdc5ad1c1514322

beforeEach(function() { 
  jasmine.Clock.useMock(); 
}); 
//... call the code that calls setTimeout 
jasmine.Clock.tick(500); // advance 500 msec 

Ответ 5

Перейдите и посмотрите jQuery и Dojo. Или вы можете зайти на сайт jsfiddle и посмотреть. У них есть набор библиотек, и вы можете тестировать онлайн без загрузки библиотек.