vue.js带有test-utils的测试单元未通过

时间:2018-09-18 16:50:19

标签: unit-testing vue.js jestjs vue-test-utils

我正在尝试测试Heading.vue组件的以下部分

      <v-layout column align-center justify-center>
        <img src="@/assets/images/logo.png" alt="Logo-Choro-des-Charentes" height="200">
        <h1 class="mb-2 display-1 text-xs-center">{{ $t('lang.views.home.heading.header1') }}</h1>
        <h2 class="mb-2 display-1 text-xs-center"> {{ $t('lang.views.home.heading.header2') }}</h2>
        <div class="subheading mb-3 text-xs-center">{{ $t('lang.views.home.heading.subheading') }}</div>
        <v-btn v-if="!listening" id="playBtn" round @click="listening = true" class="primary" large href="#">{{ $t("lang.views.home.heading.btn__listen") }}
          <v-icon right>play_arrow</v-icon>
        </v-btn>
        <v-btn v-else round large href="#">
          <audioplayer id="audioplayer" :autoplay="true" :loop="false" :sources="audioSources" @playerStop="{{ listening = false; }}"></audioplayer>
        </v-btn>
     </v-layout>

使用以下规格文件

import Vue from "vue";
import { shallowMount } from "@vue/test-utils";
import router from "@/router";
import Vuetify from "vuetify";
import i18n from "@/locales";
import Heading from "@/components/Home/Heading.vue";

describe("Heading.vue", () => {
  let wrapper;

  beforeEach(() => {
    Vue.use(router);
    Vue.use(Vuetify);
    Vue.filter("translate", function(value) {
      if (!value) return "";
      value = "lang.views.global." + value.toString();
      return i18n.t(value);
    });
    const el = document.createElement("div");
    el.setAttribute("data-app", true);
    document.body.appendChild(el);
  });

  it("should display AUDIOPLAYER on event LISTEN link click", (done) => {
    wrapper = shallowMount(Heading, { router, i18n });
    wrapper.find("#playBtn").trigger("click");
    wrapper.vm.$nextTick(() => {
      expect(wrapper.vm.listening).toBe(true);
      done();
    });
  });

});

但是我收到超时错误...。所以测试失败

 RUNS  tests/unit/Heading.spec.js

Test Suites: 1 passed, 1 of 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        9s, estimated 10s
  console.error node_modules/vue/dist/vue.runtime.common.js:589
    [Vue warn]: Error in nextTick: "Error: expect(received).toBe(expected) // Object.is equality

    Expected: true
    Received: false"

    found in

    ---> <Heading>
           <Root>

  console.error node_modules/vue/dist/vue.runtime.common.js:1739
    { Error: expect(received).toBe(expected) // Object.is equality

    Expected: true
    Received: false
        at VueComponent.toBe (/Users/yves/Developments/WIP/VUE.JS-cli-3/3-chocha-home-content/chocha/tests/unit/Heading.spec.js:37:36)
        at Array.<anonymous> (/Users/yves/Developments/WIP/VUE.JS-cli-3/3-chocha-home-content/chocha/node_modules/vue/dist/vue.runtime.common.js:1835:12)
        at flushCallbacks (/Users/yves/Developments/WIP/VUE.JS-cli-3/3-chocha-home-content/chocha/node_modules/vue/dist/vue.runtime.common.js:1756:14)
        at <anonymous>
        at process._tickCallback (internal/process/next_tick.js:188:7)
 FAIL  tests/unit/Heading.spec.js (9.708s)
  Heading.vue
    ✕ should display AUDIOPLAYER on event LISTEN link click (5191ms)

  ● Heading.vue › should display AUDIOPLAYER on event LISTEN link click

    Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.

      31 |   });
      32 | */
    > 33 |   it("should display AUDIOPLAYER on event LISTEN link click", (done) => {
         |   ^
      34 |     wrapper = shallowMount(Heading, { router, i18n });
      35 |     wrapper.find("#playBtn").trigger("click");
      36 |     wrapper.vm.$nextTick(() => {

      at Spec (node_modules/jest-jasmine2/build/jasmine/Spec.js:85:20)
      at Suite.it (tests/unit/Heading.spec.js:33:3)
      at Object.describe (tests/unit/Heading.spec.js:8:1)

Test Suites: 1 failed, 1 passed, 2 total
Tests:       1 failed, 2 passed, 3 total
Snapshots:   0 total
Time:        14.43s
Ran all test suites matching /Heading.spec.js/i.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

1 个答案:

答案 0 :(得分:1)

我使用@ click.native事件很好

        <v-btn v-if="!listening" id="playBtn" round @click.native="listening = true" class="primary" large href="#">{{ $t("lang.views.home.heading.btn__listen") }}
          <v-icon right>play_arrow</v-icon>
        </v-btn>

 it("should display AUDIOPLAYER on event LISTEN link click", () => {
    // given
    wrapper = shallowMount(Heading, { router, i18n });
    // when
    wrapper.find('#playBtn').trigger('click');
    // then
    expect(wrapper.vm.listening).toEqual(true);
  });