2016-06-08 5 views
7

Qualcuno può aiutarmi a testare input.focus() in enzima. Sto scrivendo lo script con react.Il mio codice è sotto.Test input.focus() in Enzima

public inputBox: any; 

componentDidUpdate =() => { 
    setTimeout(() => { 
     this.inputBox.focus(); 
    }, 200); 
} 

render() { 
    return (
     <div> 
      <input 
       type = 'number' 
       ref = {element => this.inputBox = element } /> 
     </div> 
    ); 
} 

risposta

2

Un altro approccio è verificare se l'elemento acquisisce la messa a fuoco, ovvero focus() viene chiamato sull'elemento nodo. Per ottenere questo elemento focalizzato, è necessario fare riferimento al tag ref come nel tuo esempio: il riferimento è stato assegnato a this.inputBox. Considerate esempio qui sotto:

const wrapper = mount(<FocusingInput />); 
const element = wrapper.instance().inputBox; // This is your input ref 

spyOn(element, 'focus'); 

wrapper.simulate('mouseEnter', eventStub()); 

setTimeout(() => expect(element.focus).toHaveBeenCalled(), 250); 

Questo esempio utilizza Jasmine spyOn, anche se è possibile qualsiasi spia Ti piacerebbe.

+0

Da dove proviene 'eventStub()'? –

+1

'eventStub' è tutto ciò che fa passare il test. In questo esempio si può presumere che il componente 'FocusingInput' sta ascoltando l'evento 'mouseEnter' e quando questo evento viene attivato (' wrapper.simulate ('mouseEnter', ...) 'fa così) il gestore di eventi può eseguire alcune operazioni sull'evento come 'preventDefault'. Per fare in modo che funzioni, è necessario preparare lo stub dell'evento che gestirà questa operazione e inviare questo stub come secondo argomento di 'simulate'. Ecco un esempio del mio [evento stub] (https://gist.github.com/mckomo/128bdb43434749ca1a2299d456ed7d7c). – mckomo

13

È possibile utilizzare mount anziché basso. Quindi è possibile confrontare document.activeElement e il nodo DOM di input per l'uguaglianza.

const output = mount(<MyFocusingComponent/>); 

assert(output.find('input').node === document.activeElement); 

Vedere https://github.com/airbnb/enzyme/issues/316 per ulteriori dettagli.

+1

Ha funzionato per me. Per essere chiari, occorrono gli oggetti globali 'window' e' document' per il mount to work. Ho usato il seguente codice prima del mio primo 'describe' per quello scopo' import jsdom da 'jsdom'; const doc = jsdom.jsdom (''); global.document = doc; global.window = doc.defaultView; ' – Ejaz

+0

Per Jest, assicurati di impostare' --env = jsdom' su CLI, o '" testEnvironment ":" jsdom "' in jest config, quindi non devi importare it – WickyNilliams