Отправка формы теста с помощью Jest & TestUtils

У меня проблемы с проверкой формы submit событие с использованием React, TestUtils и Jest.

У меня есть компонент, который делает <form> Элемент DOM; тот же компонент также имеет метод, который обрабатывает onSubmit событие и записывает заявление. Моя цель - издеваться над onSubmit обработчик и утверждают, что это называется.

Форма-component.cjsx

module.exports = React.createClass

  # Handle form submissions
  handleSubmit: (e) ->
    console.log 'Make async call'

  # Render a form
  render: ->
    <form onSubmit={@handleSubmit}>
      <input type="submit" />
    </form>

__tests __ / test-form-component.coffee

jest
  .dontMock '../form-component'

React = require 'react/addons'
TestUtils = React.addons.TestUtils
FormComponent = require '../form-component'

describe 'FormComponent', ->
  it 'creates a log statement upon form submission', ->
    # Render a FormComponent into the dom
    formInstance = TestUtils.renderIntoDocument(<FormComponent />)

    # Mock the `handleSubmit` method
    formInstance.handleSubmit = jest.genMockFunction()

    # Simulate a `submit` event on the form
    TestUtils.Simulate.submit(formInstance)
    # TestUtils.Simulate.submit(formInstance.getDOMNode()) ???

    # I would have expected the mocked function to have been called
    # What gives?!
    expect(formInstance.handleSubmit).toBeCalled()

Смежные вопросы:

2 ответа

Существует проблема с тем, как React вызывает обработчики событий, из-за чего исходная функция-обработчик продолжает вызываться, даже если вы сначала попытаетесь ее смоделировать.

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

onSubmit: function() {
    this.handleSubmit();  // extra fn needed for Jest
},
handleSubmit: function(){
    this.setState({
        submitted: true
    });
}

Вы бы установили форму onSubmit={this.onSubmit} и издеваться handleSubmit вместо onSubmit, Так как это вводит, казалось бы, ненужную дополнительную функцию, если вы решите сделать это, вероятно, стоит добавить комментарий, чтобы предвидеть последующие попытки "исправить это", что может нарушить тест.

В чем именно заключается ваша проблема?

React.addons.TestUtils.Simulate.submit() работает для меня.

Если это может помочь, я был в подобной ситуации, и я тестировал обработчик отправки таким образом (используя sinon.js, mocha а также chai):

var renderDocumentJQuery = $(renderDocument.getDOMNode())
this.xhr = sinon.useFakeXMLHttpRequest();
var requests = this.requests = [];
this.xhr.onCreate = function (xhr) {
    requests.push(xhr);
};
renderDocumentJQuery.find('input#person_email').val('test@email.com');
React.addons.TestUtils.Simulate.submit(renderDocumentJQuery.find('form')[0]);
var requestFired = requests[0];
this.xhr.restore();
it('should fire an AJAX with the right params', function(){
  assert.equal(requestFired.requestBody,'campaign_id=123&owner_id=456&person%5Bemail%5D=test%40email.com')
});
it('should fire an AJAX with a POST method', function(){
  assert.equal(requestFired.method,'POST')
});
it('should fire an AJAX with the correct url', function(){
  assert.equal(requestFired.url,'url-for-testing')
});
Другие вопросы по тегам