Enzyme을 이용한 React 컴포넌트 Prop 변경 테스팅

React 테스팅: Enzyme을 사용하여 프롭 변경 및 컴포넌트 재렌더링 검증하기 React 컴포넌트를 다룰 때, 프롭 변경이 올바르게 적용되고 컴포넌트가 올바르게 재렌더링되는지 확인하는 것이 중요합니다. 이 블로그 포스트에서는 React용 인기 있는 테스팅 유틸리티인 Enzyme을 사용하여 프롭 …

title_thumbnail(Enzyme을 이용한 React 컴포넌트 Prop 변경 테스팅)

React 테스팅: Enzyme을 사용하여 프롭 변경 및 컴포넌트 재렌더링 검증하기

React 컴포넌트를 다룰 때, 프롭 변경이 올바르게 적용되고 컴포넌트가 올바르게 재렌더링되는지 확인하는 것이 중요합니다. 이 블로그 포스트에서는 React용 인기 있는 테스팅 유틸리티인 Enzyme을 사용하여 프롭 변경을 검증하고 컴포넌트 재렌더링을 확인하는 방법을 살펴보겠습니다.

이슈 이해하기

Foo라는 React 컴포넌트가 있고 name이라는 프롭을 가지고 있다고 상상해 봅시다. 이 컴포넌트는 name 프롭에서 유도된 클래스와 값 속성을 갖는 입력 요소를 렌더링합니다.

다음은 예시 코드 스니펫입니다:

class Foo extends React.Component {
    render() {
        return (
            <input className={this.props.name} type="text" value={this.props.name} onChange={()=>{}} />
        );
    }
}

name 프롭이 변경될 때 컴포넌트의 동작을 테스트하려고 할 때 이슈가 발생합니다. 컴포넌트의 상태가 올바르게 업데이트되어 입력 요소의 값 속성에 해당 변경 사항이 반영되는지 확인하려고 합니다.

해결책

이 이슈를 해결하는 핵심은 새로운 프롭을 설정한 후 컴포넌트를 강제로 업데이트하는 것입니다. 이를 위해 Enzyme 래퍼에 있는 update() 메소드를 호출할 수 있습니다.

다음은 Enzyme의 mount 함수를 사용한 업데이트된 테스트 케이스입니다:

it('should pass and does not', () => {
    const wrapper = mount(<Foo name="foo" />);
    expect(wrapper.find('.foo').html()).toBe('<input class="foo" type="text" value="foo">');
    wrapper.setProps({ name: 'bar' });
    wrapper.update(); // 컴포넌트 강제 업데이트
    expect(wrapper.find('.bar').html()).toBe('<input class="bar" type="text" value="bar">');
});

Enzyme 래퍼에서 update()를 호출함으로써 컴포넌트가 새로운 프롭 값으로 다시 렌더링되도록 보장합니다. 이를 통해 입력 요소의 값 속성에 대한 정확한 변경 사항을 확인할 수 있습니다.

반드시 update()를 호출하지 않으면 setProps()를 사용할 때 컴포넌트의 렌더 메소드가 자동으로 트리거되지 않으므로 테스트는 실패합니다.

결론

이 블로그 포스트에서는 React에서 Enzyme을 사용하여 프롭 변경을 확인하고 컴포넌트 재랜더링을 검증하는 방법을 살펴보았습니다. Enzyme 래퍼에서 update() 메소드를 호출하여 컴포넌트를 업데이트함으로써 새로운 프롭으로 컴포넌트가 다시 렌더링되어 예상한 변경 사항을 확인할 수 있습니다.

프롭 변경이 컴포넌트의 상태와 렌더링에 올바르게 반영되는지 확인하는 것은 신뢰성이 있고 포괄적인 테스팅에 필수적입니다. Enzyme의 update() 메소드를 사용하면 프롭 변경과 관련하여 React 컴포넌트를 자신 있게 테스트하고 일관된 동작을 보장할 수 있습니다.

이러한 기술을 테스트 작업 흐름에 통합함으로써 React 애플리케이션의 신뢰성과 품질을 강화할 수 있습니다.

참고 자료 : 

reactjs

Leave a Comment