VTU란 vue test utils의 약자로 vue component를 테스트하기 위한 도구들이다. vitest는 사실 vue와 상관없이 vite라는 환경에서 javascript의 동작을 테스트하기 위한 것이어서 vue를 테스트하기에는 한계가 있기 때문에 VTU가 추가로 필요하다. (vitest가 Junit이라면 VTU는 @ExtendWith(SpringExtension) 정도로 생각하면 쉽겠다)
vtu는 프로젝트를 생성하면서 Vitest를 선택하면 자동으로 설치된다. 만약 직접 설치해야 한다면 다음의 명령을 이용하자.
npm i @vue/test-utils
주요 API
mount와 shallowMount
테스트를 위해 가장 먼저 할 일은 Vue Component를 생성하는 일이다. mount()는 테스트할 대상인 Vue Component에 대한 wrapper인 VueWrapper를 반환해준다. mount를 호출하면서 options 객체를 통해 data, props 등 여러 가지 정보를 전달할 수 있다.
mount()와 아주 유사하게 shallowMount() 함수로 제공이 된다. 사실 shallowMount()는 mount(component, {shallow:true})와 동일하다.
이 둘의 차이점은 mount()는 연결된 모든 자식 component까지 다 구성하는 반면 shallowMount()는 자식 component를 제외한 상태로 wrapper를 생성한다. 사실 단위테스트라는 것이 다른 요소와의 상호 작용 없이 테스트하는 것을 선호하기 때문에 단위테스트라는 개념에는 shallowMount()가 훨씬 적절하다.
option 중 global 속성은 개별 컴포넌트를 위해서 제공되는 내용이 아닌 모든 컴포넌트가 영향을 받을 수 있는 내용들이 작성된다. 예를 들어 props는 개별 컴포넌트에 전달되지만 provide는 모든 컴포넌트에 inject로 참조할 수 있다. 전역 컴포넌트등도 비슷한 개념이다.
component가 로딩되면 다음에 할 일은 화면을 구성하는 element를 조회해서 DOMWarpper로 반환 받아야 한다. DOMWrapper란 DOM 객체를 감싸는 객체로 그냥 DOM을 쓰는 것보다는 다양한 기능을 제공한다. 만약 순수한 DOM 객체를 사용하려는 경우 DOMWrapper의 wrapperElement 속성을 사용하면 된다.
find와 동일한데 만약 대상이 없을 경우 예외 전달 get<T extends Element>(selector: string): Omit<DOMWrapper<T>, 'exists'> get(selector: string): Omit<DOMWrapper<Element>, 'exists'>
내용 조회
다음은 조회된 element의 내용을 확인하기 위한 함수이다. innerHTML, innerText등과 유사한 기능을 갖는다.