Как имитировать события браузера при написании тестов для React js?

Как имитировать щелчок на элементе div? Или движение мыши? Или ввод текста?

Как это сделать в среде nodejs на стороне сервера, например, mocha? И как это сделать в среде браузера с бегуном, как карма?

Ответы

Ответ 1

Начиная с версии React 0.9, мы включили ReactTestUtils, который представляет собой небольшой набор инструментов, которые помогут вам протестировать ваши компоненты. Самой полезной частью этого является симуляция событий - вы можете запустить ReactTestUtils.Simulate.click(node), чтобы имитировать событие клика с использованием синтетической системы событий React.

Там также есть несколько других полезных утилит для утверждения утверждений о структуре DOM. Просто загрузите сборку addons (react-with-addons.js) и вытащите ее так:

var ReactTestUtils = React.addons.TestUtils;
ReactTestUtils.Simulate.click(node);

Сообщите мне, если что-то неясно здесь.

Ответ 2

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

Например, у меня есть компонент, который должен что-то сделать в ответ на нажатие клавиши "tab"

// this is hooked up in my render function
onKeyPress: function (e) {
  if (e === 9) {
    e.preventDefault()
    this.onTab(e.shiftKey)
    return
  }
  ..
},
onTab: function (shift) {
  var newstate = states.tab(shift, this.state)
  if (newstate) this.setState(newstate)
}

Затем в файле states.js у меня есть логическая обработка, как я должен изменить состояние на основе текущего состояния и тот факт, что пользователь нажал клавишу табуляции. Этот метод states.tab является 100% unittestable, потому что это "чистый" — никаких побочных эффектов. Он принимает состояние и возвращает новое состояние.

И, возможно, это не "ответ на вопрос" напрямую, но я стараюсь быть полезным =) Развязка логики изменения состояния от обработчиков событий сделает ваш код намного более проверяемый и поддерживаемый.

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