테스트코드

🌮 부모컴퍼넌트에 Video 태그가 있는 경우의 단위테스트

frontChoi 2024. 1. 22. 08:37
반응형

🍟 컴퍼넌트 구조

videoTestView에서 재생버튼을 누르면, mainLayout.vue에서 Video태그를 호출한다.

이렇게 관리되는 이유는 Video태그가 다른 화면에서 관리되기 때문인데,

이렇게 구조를 만들면, videoTestView에서 단위테스트 실시할 경우, mainLayout을 가져올 수 없기 때문에 

에러가 발생한다.

단위테스트 실시하는 경우 videoTestView에서 재생버튼을 호출하면, video 태그가 존재하지 않기 때문에 오류가 발생한다.

 

그리하여, createElement를 이용하여, video를 생성하고, video객체를 세팅해준다.

import { shallowMount, createLocalVue } from "@vue/test-utils";
import Plugins from '@/plugins/Plugins';
import videoTestView from '../../videoTestView.vue';
import { videoObject } from "@/utils/video"
describe('Name of the group', () => {
  let wrapper = null;
  beforeEach(async () => {
   /* 1.createElement을 이용하여 video 객체 생성 */
    const video = document.createElement('video');
    video.setAttribute("id", "global_video")
    const localVue = createLocalVue();
    localVue.use(Plugins);
    /* 2.video객체를 이용하여, video 인스턴스 세팅 */
    videoObject.setVideo(video)
    wrapper = shallowMount(videoTestView, {
      localVue
    })
  });
  test('재생시작 ', async () => {
    const btn = wrapper.find("#playbtn");
    btn.trigger('click')
  });
});

 

위와 같이 세팅 할 경우 새로운 오류가 발생하였다.

"Not implemented: HTMLMediaElement.prototype.play"  가 발생하였는데, HTMLVideoElement 은 HTMLMediaElement를 상속받는건데, 상속받지 못하였다는 오류가 발생하였다. 

 

그리하여 새롭게 아래 코드를 추가하였다.

여기서 "mockResolvedValue" 를 사용 한 것은 video play가 Promise이기 때문에, then을 받아야 하기 때문이다.

 test('재생시작 ', async () => {
    jest.spyOn(window.HTMLMediaElement.prototype, 'play')
      .mockResolvedValue(() => { });
    const btn = wrapper.find("#playbtn");
    btn.trigger('click')
  });

 

위 코드를 추가 함으로써 테스트를 성공하였다.

반응형