개인적으로 최근까지 Vue기반 프론트엔드 개발을 하다가, 오랜만에 React를 사용하여 개발하고 있다. 예전에는 Enzyme를 사용하여 shallow render에서 단위 테스트를 진행했는데, 최근 React에는 Testing Libary를 사용하여 브라우저에서 동작하는 Full render 방식에서 단위 테스를 작성하는 것이 추세인 것 같다. (참고로, Enzyme은 글을 작성하는 현재 React 18을 지원하지 않고 있다.)
return ( <JoditEditor ref={editor} value={content} config={config} tabIndex={1} // tabIndexoftextarea onBlur={(newContent) => setContent(newContent)} // preferred to use only this option to update the content for performance reasons onChange={handleChange} /> );
게시판 등록 페이지(NewArticle.js)에서는 Editor 컴포넌트를 사용하여, onChange 이벤트 핸들러 함수(handleChangeContents)에서 에디터에서 변경된 html과 plainHtml을 전달받아 state로 관리한다. 저장 버튼을 클릭하면, 게시글 제목과 에디터에서 등록된 htmlContents, plainContents 내용을 가지고 신규 게시글을 등록한다.
Jodit Editor의 onChange 이벤트를 실행하기 위해서, 내부적으로 Jodit Editor가 동작하는 방식을 확인해야 한다. Shallow render 방식에서는 Editor 컴포넌트를 찾고, 이벤트를 실행하면 간단하지만 Full render 방식에서는 Jodit editor가 어떻게 render되고, 그 안에서 onChange 이벤트를 실행하기 위한 동작 확인이 필요하다. (단순히 <p> 태그를 찾아서 innerHtml에 컨텐츠를 수정하는 방식으로는 onChange 이벤트가 실행되지 않았다.)
Jodit Editor에서 onChange 이벤트를 실행해야만 NewArticle 페이지에서 컨텐츠 내용을 세팅할 수 있는데, 테스트를 작성하려는 대상인 SUT(System Under Test)에 집중해야 하는데 테스트 대상보다는 내부에 의존하고 있는 Third-party 라이브러리 분석에 시간이 오래 걸리는 상황이 단위 테스트 작성하기 어렵게 만들었다.
이런 문제를 해결하기 위해서 테스트 하기 쉬운 방법을 찾아야만 했다.
Full render에서 Editor 컴포넌트 Mocking
Testing Library는 그대로 사용
Jodit Editor를 감싼 Editor.js 컴포넌트를 Jest를 사용하여 Mocking 하기