2016-06-08 5 views
7

Kann mir jemand helfen, input.focus() in Enzym zu testen. Ich schreibe das Skript mit react.My Code ist unten.Testen von input.focus() in Enzym

public inputBox: any; 

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

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

Antwort

2

Ein anderer Ansatz besteht darin, zu testen, ob Element den Fokus erhält, d. H. focus() wird am Knotenelement aufgerufen. Um dieses fokussierte Element zu erreichen, muss über ref ein Tag wie in Ihrem Beispiel referenziert werden - Referenz wurde this.inputBox zugewiesen. Betrachten Sie beispielsweise unter:

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); 

Dieses Beispiel verwendet Jasmins spyOn, wenn Du keinen Spion, die Sie mögen.

+0

Woher kommt 'eventStub()'? –

+1

'eventStub' ist alles, was Ihren Test bestanden hat. In diesem Beispiel können Sie davon ausgehen, dass die Komponente 'FocusingInput' das 'mouseEnter'-Ereignis überwacht und wenn dieses Ereignis ausgelöst wird (' wrapper.simulate (' mouseEnter ', ...) 'tut das), kann der Event-Handler einige Operationen für das Ereignis ausführen wie 'preventDefault'. Damit dies funktioniert, müssen Sie einen Ereignis-Stub vorbereiten, der diese Operation verarbeitet, und diesen Stub als zweites Argument von 'simulate' senden. Hier ist ein Beispiel für meinen [Ereignis-Stub] (https://gist.github.com/mckomo/128bdb43434749ca1a2299d456ed7d7c). – mckomo

13

Sie können mount statt flach verwenden. Dann können Sie document.activeElement und den Eingabe-DOM-Knoten für Gleichheit vergleichen.

const output = mount(<MyFocusingComponent/>); 

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

Weitere Informationen finden Sie unter https://github.com/airbnb/enzyme/issues/316.

+1

Arbeitete für mich. Um es klar zu sagen, man braucht globale "Fenster" - und "Dokument" -Objekte, damit mount funktionieren kann. Ich habe folgenden Code vor meinem ersten 'describe' zu ​​diesem Zweck verwendet:' jsdom aus 'jsdom' importieren; const doc = jsdom.jsdom (''); global.document = doc; global.window = doc.defaultView; ' – Ejaz

+0

Für Jest, stellen Sie sicher, dass Sie' --env = jsdom' bei CLI oder '" testEnvironment ":" jsdom "' in jest config, dann müssen Sie nicht importieren it – WickyNilliams

Verwandte Themen