2014-11-24 10 views
5

Mam problem z testowaniem zdarzenia o nazwie submit przy użyciu opcji React, TestUtils i Jest.Prześlij formularz zgłoszenia testowego za pomocą polecenia Jest & TestUtils

Mam element, który renderuje element DOM <form>; ten sam składnik ma również metodę, która obsługuje zdarzenie onSubmit i loguje instrukcję. Moim celem jest kpić z obsługi onSubmit i twierdzić, że jest wywoływana.

forma-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() 

Podobne pytania:

Odpowiedz

0

Co wydaje się być twoim problemem?

React.addons.TestUtils.Simulate.submit() dla mnie.

Jeśli to może pomóc, byłem w podobnej sytuacji i testowanie programu obsługi złożyć w ten sposób (za pomocą sinon.js, mocha i 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('[email protected]'); 
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') 
}); 
0

Jest takie issue with the way React calls event handlers który wywołuje pierwotną funkcję obsługi do dalszego być powołanym, nawet jeśli najpierw próbujesz z niego drwić.

Można tego najwyraźniej uniknąć, przechodząc na ES6 class syntax w celu utworzenia klas komponentów, ale innym prostym rozwiązaniem jest ustawienie funkcji obsługi zdarzenia po prostu wywołanie drugiej funkcji i naśmiewanie się z niej. Na przykład:

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

by ustawić formularz na onSubmit={this.onSubmit} i makiety handleSubmit zamiast onSubmit. Ponieważ wprowadza to pozornie zbędną dodatkową funkcję, jeśli zdecydujesz się to zrobić, prawdopodobnie warto dodać komentarz, aby przewidzieć późniejsze próby "naprawienia", które przerwałyby test.

Powiązane problemy