Vue 유닛 테스트 에 관 한 몇 개의 구 덩이 를 상세 하 게 설명 합 니 다.

5527 단어 Vue유닛 테스트
앞 에 쓰다
이 글 의 코드 는 karma,mocha,chai,sinon-chai 를 사용 하여 Vue 의 인 스 턴 스 속성 에 맞 춰 유닛 테스트 를 진행 합 니 다.
2.전체적인 구성 요소 의 구덩이
제 g-icon 은 전역 적 으로 등록 되 어 있 기 때문에 g-input 구성 요 소 를 사용 할 때 g-icon 은 직접 사용 하기 때문에 테스트 할 때 icon 과 관련 된 코드 는 영원히 틀 립 니 다.
g-icon 부분 등록 구성 요소
3.테스트 중 클릭 이벤트 발동
app.vue 에서 g-input 구성 요 소 를 사용 하 는 것 을 모 의 합 니 다.

<g-input v-model="message"></g-input>
new 이벤트 와 dispatch 시 뮬 레이 션 이 벤트 를 사용 하여 구성 요소 에서 촉발 합 니 다.이 이 벤트 는 실제 이벤트 와 다 르 지만 이름 만 같 으 면 됩 니 다.리 셋 함수 자체 의 인 자 를 테스트 합 니 다.

it("    ", () => {
   ["change", "input", "focus", "blur"].forEach(eventName => {
    vm = new Constructor({}).$mount();
    const callback = sinon.fake();
    vm.$on(eventName, callback);
    let event = new Event(eventName);
    Object.defineProperty(event, "target", {
     value: { value: "hi" },
     enumerable: true
    });
    let inputElement = vm.$el.querySelector("input");
    inputElement.dispatchEvent(event);
    expect(callback).to.have.been.calledWith("hi");
   });
  });
이 구성 요소 이벤트 가 실 행 될 때 리 셋 된 인 자 를 테스트 합 니 다.사용자 정의 이벤트 에 target 이 없 기 때문에 직접 써 야 합 니 다.
value:{value:"hi"}첫 번 째 value 는 define Property 입 니 다.
4.Vue 버 전
구 덩이 는 다음 코드 에서 나온다.

it("  gutter", function(done) {
  Vue.component("g-row", Row);
  Vue.component("g-col", Col);
  const div = document.createElement("div");
  document.body.appendChild(div);
  div.innerHTML = `
  <g-row gutter="20"> 
    <g-col></g-col> 
    <g-col></g-col> 
  </g-row>`;
  const vm = new Vue({
   el: div
  });
  setTimeout(() => {
   const row = vm.$el.querySelector(".row");
   expect(getComputedStyle(row).marginRight).to.eq("-10px");
   expect(getComputedStyle(row).marginLeft).to.eq("-10px");
   const cols = vm.$el.querySelectorAll(".col");
   expect(getComputedStyle(cols[0]).paddingRight).to.eq("10px");
   expect(getComputedStyle(cols[1]).paddingLeft).to.eq("10px");
   done();
   vm.$el.remove();
   vm.$destroy();
  }, 0);
 });
저 는 el 에 template 코드 를 직접 기록 하기 때문에 기본 import Vue from"vue"(runtime only 버 전)에서 이 코드 를 컴 파일 할 수 없습니다.import Vue from"../nodemodules/vue/dist/vue.esm.js"위 에서 도입 하면 됩 니 다.
template 옵션 이 없 으 면 엘 은 바 꾸 지 않 습 니 다.
5.비동기 테스트
아니면 이 코드 입 니까?먼저 두 구성 요소 의 관 계 를 테스트 합 니 다.

it("  gutter", function(done) {
  Vue.component("g-row", Row);
  Vue.component("g-col", Col);
  const div = document.createElement("div");
  document.body.appendChild(div);
  div.innerHTML = `
  <g-row gutter="20"> 
    <g-col></g-col> 
    <g-col></g-col> 
  </g-row>`;
  const vm = new Vue({
   el: div
  });
  setTimeout(() => {
   const row = vm.$el.querySelector(".row");
   expect(getComputedStyle(row).marginRight).to.eq("-10px");
   expect(getComputedStyle(row).marginLeft).to.eq("-10px");
   const cols = vm.$el.querySelectorAll(".col");
   expect(getComputedStyle(cols[0]).paddingRight).to.eq("10px");
   expect(getComputedStyle(cols[1]).paddingLeft).to.eq("10px");
   done();
   vm.$el.remove();
   vm.$destroy();
  }, 0);
 });
왜 seTimeout 이 필요 한 지 먼저 말씀 드 리 겠 습 니 다.
created 와 mounted 갈고리 에 대해 말하자면 createElement 와 append Child 는 js 코드 에서 동기 화 되 고 두 개의 갈 고 리 는 각각 이 두 개의 코드 후에 실행 되 며 갈 고 리 는 비동기 적 으로 실 행 됩 니 다.
g-row 구성 요소 에 mounted 갈고리 가 있 기 때문에 비동기 검 사 를 해 야 합 니 다.그렇지 않 으 면 new Vue 이후 에 바로 테스트 를 해 야 합 니 다.갈 고 리 는 아직 완성 되 지 않 았 습 니 다.
mocha 비동기 테스트
mocha 는 기본적으로 비동기 가 실행 되 지 않 습 니 다.done 인 자 를 추가 하고 done()를 호출 하면 됩 니 다.
쓰레기 회수
모든 테스트 가 끝 난 후에 다음 두 개의 코드 를 써 야 한다.

vm.$el.remove();
 vm.$destroy();
두 가지 작용 이 있다.
  • 페이지 에 있 는 데이터 소각
  • 메모리 에 있 는 데 이 터 를 소각 합 니 다
  • js 는 단일 스 레 드 이지 만 dom 스 레 드 가 하나 더 있 습 니 다.
    
    var div = document. getElementById('xxx')
    div.onclick = function() {
      ///code
    }
    setTimeout(function(){
      div. remove()
    }, 3000)
    지금 우 리 는 언제 div 의 함수 가 회수 되 었 는 지 토론 합 니 다.
    함수 가 전역 변수 div 의 onlick 에 인용 되 었 습 니 다.
    div.remove()는 페이지 에서 만 삭제 되 었 을 뿐 메모리 에서 삭제 되 지 않 았 습 니 다.
    
    var div = document. getElementById('xxx')
    div.onclick = function() {
      ///code
    }
    setTimeout(function(){
      div = mull
    }, 3000)
    
    이 함 수 는 삭제 되 지 않 았 습 니 다.함 수 는 dom 에 쓰 여 있 습 니 다.div 변 수 는 dom 대상 만 참조 하 였 습 니 다.
    
    var div = document. getElementById('xxx')
    div.onclick = function() {
      ///code
    }
    setTimeout(function(){
      var div2 = document. getElementById('xxx')
    }, 3000)
    
    div=null 과 div.remove 를 동시에 하면 됩 니 다.각각 메모리 와 dom 에서 삭 제 됩 니 다.
    i.bug 가 있 습 니 다.그래도 지 울 수 없습니다.div.onlick=null 가능 합 니 다.
    Vue 유닛 테스트 에 관 한 몇 개의 구덩이 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Vue 유닛 테스트 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기