Имитация щелчка по документу ReactJS/JSDom

Итак, я пишу некоторые тесты для кода, который добавляет событие click на документ. Я использую настройку JSDom, ReactJS и Mocha/Chai. Я попробовал следующий код в тесте:

document.addEventListener('click', function() {
  console.log('test');
});
React.addons.TestUtils.Simulate.click(document);
//also tried React.addons.TestUtils.Simulate.click(document.body);

однако этот код не производит Эхо, что я ожидал.

есть ли способ имитировать щелчок, keyup и т. д... на документе с JSDom и ReactJS?

обновление

для ответов Ника я попытался добавить это код к тесту:

document.body.addEventListener('click', function() {
  console.log('test');
});

document.body.click();

и я пока не получаю вывод журнала консоли. Я не уверен, есть ли какие-то проблемы с JSDom и делать такие вещи.

если я не могу модульный тест этого кода, это нормально, уже есть некоторый код, который я не могу модульный тест прямо сейчас (код, который требует реального DOM, чтобы иметь возможность получить ширину, высоту и т. д...) но я хотел бы иметь возможность модульного тестирования большей части кода (и я не заинтересован в использовании PhantomJS для модульного тестирования). Мой интеграционные тесты будут охватывать этот тип кода.

обновление 2

еще одна вещь, чтобы отметить, что, когда я console.log(document); Я вижу объект, прикрепленный к _listeners собственность за click поэтому я знаю, что событие прикрепляется, оно просто не выполняется.

3 ответов


обновление: document.body.click будет работать в браузере, но для jsdom вам нужно вручную создать событие:

document.body.addEventListener('click', function() {
  console.log('test');
});

var evt = document.createEvent("HTMLEvents");
evt.initEvent("click", false, true);
document.body.dispatchEvent(evt)

приведенный выше код работает для меня в шутку и также должен работать с "solo" jsdom.


реагировать.дополнения.Тестутилы.Имитация работает только с виртуальными событиями. Если вы хотите отправить собственные события, вы можете сделать это с помощью DOM api напрямую.

при моделировании щелчка, если у вас есть компонент, который отображает это:

<div>
   <button onClick={alert}>click me</button>
</div>

и у вас есть ссылка на <button/> в переменной под названием "buttonEl" и запустите это:

React.addons.TestUtils.Simulate.click(buttonEl, 'hello world');

вы получите предупреждение с "hello world" в нем. Все тесты utils создают виртуальное событие и позволяют ему пузыриться вверх по виртуальному дереву dom, вызывая обработчики событий по пути.


просто создать Event и направить его:

// Add an event listeners to the document
document.addEventListener('click', function() {
    console.log('test');
});

// Create a new `click` event and `dispatch` it
var event = new MouseEvent('click')
document.dispatchEvent(event)