2016-06-08 5 views
7

효소에서 input.focus()를 테스트 할 수있는 사람이 누구든지 도와 줄 수 있습니까? react.My 코드가있는 스크립트를 작성하고 있습니다.Enzyme에서 ​​input.focus() 테스트

public inputBox: any; 

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

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

답변

2

다른 방법은 요소가 포커스를 얻었는지 테스트하는 것입니다. 즉, 노드 요소에 focus()이 호출됩니다. 이 집중 요소를 달성하려면 예를 들어 ref 태그를 통해 참조해야합니다. 참조는 this.inputBox으로 지정되었습니다. 아래의 예를 생각해 보면 어떤 스파이 당신이 좋아하는 수 있지만

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

이 예 것은, 재스민의 spyOn 사용합니다.

+0

'eventStub()'은 어디에서 왔습니까? –

+1

'eventStub'는 테스트를 통과시키는 모든 것입니다. 이 예제에서 'FocusingInput' 구성 요소가'mouseEnter '이벤트를 듣고 있으며이 이벤트가 트리거되면 ('wrapper.simulate ('mouseEnter', ...) ') 이벤트 처리기가 이벤트에 대해 일부 작업을 수행 할 수 있다고 가정 할 수 있습니다 'preventDefault'와 같습니다. 이 작업을 수행하려면이 작업을 처리 할 이벤트 스텁을 준비하고이 스텁을'simulate'의 두 번째 인수로 보내야합니다. 다음은 내 [이벤트 스텁] (https://gist.github.com/mckomo/128bdb434347caca1a2299d456ed7d7c)의 예입니다. – mckomo

13

얕은 대신 mount을 사용할 수 있습니다. 그러면 document.activeElement과 입력 DOM 노드가 동일한 지 비교할 수 있습니다.

const output = mount(<MyFocusingComponent/>); 

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

자세한 내용은 https://github.com/airbnb/enzyme/issues/316을 참조하십시오.

+1

나를 위해 일했습니다. 그냥 분명히하기 위해서, 작업을하기위한 전역'window'와'document' 객체가 필요합니다. 나는'jsdom '에서 jsdom을 가져 오기위한 첫 번째'describe' 전에 다음 코드를 사용했습니다. const doc = jsdom.jsdom (''); global.document = doc; global.window = doc.defaultView;' – Ejaz

+0

Jest의 경우 CLI에서'--env = jsdom'을 설정하고 Jest config에서''testEnvironment ': "jsdom"'을 설정했는지 확인하십시오. 그러면 가져올 필요가 없습니다 it – WickyNilliams