2015-03-11 4 views
7

ho il seguente codice in un test basato scherzo:chiamando setState su un componente reactjs con utils test non ri-rendering componente

it('will show the hero loop if there is one', function() { 

    var React = require('react/addons'); 
    var ShowsDetailHeader = require('../../../../routes/shows/components/ShowsDetailHeader.jsx'); 
    var mockData = require('../../../../mock/episodeDetailData'); 
    mockData.data.show.assets._webHeroVideoUrl = 'https://test.video.com'; 

    var Subject = require('../../../../mock/stubRouterContext')(ShowsDetailHeader, { 
     show: mockData.data.show 
    }); 

    var TestUtils = React.addons.TestUtils; 

    var showsHeader = TestUtils.renderIntoDocument(
     <Subject /> 
    ); 

    showsHeader.setState({ 
     showVideo: true 
    }); 

    var videoClass = TestUtils.findRenderedDOMComponentWithClass(showsHeader, 'flex-video').getDOMNode().getAttribute('class'); 

    expect(videoClass.indexOf('in')).toBe(-1); 

    console.log(videoClass); 


    }); 

La mia prova precedente verifica lo stato iniziale del componente. Ora desidero chiamare setState per controllare il componente dopo un cambio di stato. La videoclass che sto registrando qui rimane la stessa. Sto reagendo 0.12. e ultimo jest 0.4.0.

Qualche idea su come testare cosa succede dopo lo stato impostato?

risposta

1

setState è asincrona, quindi probabilmente bisogno di

showsHeader.setState({ 
     showVideo: true 
    }); 
jest.runAllTicks(); 
find ... 
expect ... 

Ma penso che lo stato dovrebbe essere privato e non dovrebbe essere diretta cambiato, Stato dovrebbe essere il cambiamento all'interno di un componente, causa per evento ui o modifica dei dati. un'opzione utilizza props per pubblico, se si desidera modificare il componente dall'esterno.

+0

sì, lo stato è privato, ma in questo caso particolare nel resto del componente sto ascoltando la presenza di un evento su un elemento video e il gestore viene chiamato quando si verifica questo evento. Posso almeno chiamare quel metodo invece di setState direttamente. fantastico, sono ancora nuovo per scherzo. willl testarlo e poi contrassegnare la risposta. –

+0

runAllTicks non ha aiutato la questione. inoltre, non correlato, non riesco a chiamare il metodo che sta cambiando stato, continuando a ottenere oggetto Object non ha metodo [methodName]. –

+0

Ciao, sto provando a testare l'impostazione dello stato con Jest e React Test Utils, se pensi di avere un momento? https://stackoverflow.com/questions/44399181/react-jest-how-to-test-changing-state-in-component-and-checking-for-another-co –