【问题标题】:vuetify test-utils & Jest : button click not handledvuetify test-utils & Jest:按钮点击未处理
【发布时间】:2019-03-04 16:44:33
【问题描述】:

给定以下 AudioPlayer.vue 组件

<template>
  <div style="display: inline-block;">
    <v-btn id="playPauseBtn" class="inline teal--text" outline icon @click.native="playing ? pause() : play()">
      <v-icon v-if="playing === true">pause</v-icon>
      <v-icon v-else>play_arrow</v-icon>
    </v-btn>
    <v-btn id="stopBtn" outline icon class="inline teal--text" @click.native="stop()">
      <v-icon>stop</v-icon>
    </v-btn>
    <v-btn id="muteBtn" outline icon class="inline teal--text" @click.native="toggleMute()">
      <v-icon v-if="muted === false">volume_up</v-icon>
      <v-icon v-else>volume_off</v-icon>
    </v-btn>
    <v-slider id="progress" class="inline slider" color="#464898" :value="trackProgress" @change="setPosition" @end="audioEnded"></v-slider>
    <p class="inline" id="duration" style="color: #464898">{{ currentTimeFmt }} / {{ durationFmt }}</p>>
  </div>
</template>

<script>
import VueHowler from "vue-howler";

const formatTime = second => {
  let time = new Date(second * 1000).toISOString().substr(11, 8);
  return time;
};

export default {
  mixins: [VueHowler],
  name: "audioPlayer",
  data() {
    return {
      percentage: 0
    };
  },
  computed: {
    trackProgress() {
      return this.progress * 100;
    },
    durationFmt() {
      return formatTime(this.duration);
    },
    currentTimeFmt() {
      return formatTime(this.duration * this.progress);
    }
  },
  watch: {
    playing() {
      if (!this.playing && this.progress === 0 && this.seek === 0) {
        this.$emit("playerStop");
      }
    }
  },
  methods: {
    setPosition(sliderValue) {
      this.percentage = sliderValue;
      const currentDuration = parseInt((this.duration * this.percentage) / 100);
      this.setSeek(currentDuration);
    },
    stop() {
      console.log("STOP!");
      this.$data._howl.stop();
      this.$emit("playerStop");
    },
    audioEnded(sliderValue) {
      this.percentage = sliderValue;
      // console.log("audio ended");
      this.stop();
    }
  }
};
</script>

我正在尝试测试触发 stop() 方法的 STOP 按钮...

<template>
  <div style="display: inline-block;">
    <v-btn id="playPauseBtn" class="inline teal--text" outline icon @click.native="playing ? pause() : play()">
      <v-icon v-if="playing === true">pause</v-icon>
      <v-icon v-else>play_arrow</v-icon>
    </v-btn>
    <v-btn id="stopBtn" outline icon class="inline teal--text" @click.native="stop()">
      <v-icon>stop</v-icon>
    </v-btn>
    <v-btn id="muteBtn" outline icon class="inline teal--text" @click.native="toggleMute()">
      <v-icon v-if="muted === false">volume_up</v-icon>
      <v-icon v-else>volume_off</v-icon>
    </v-btn>
    <v-slider id="progress" class="inline slider" color="#464898" :value="trackProgress" @change="setPosition" @end="audioEnded"></v-slider>
    <p class="inline" id="duration" style="color: #464898">{{ currentTimeFmt }} / {{ durationFmt }}</p>>
  </div>
</template>

<script>
import VueHowler from "vue-howler";

const formatTime = second => {
  let time = new Date(second * 1000).toISOString().substr(11, 8);
  return time;
};

export default {
  mixins: [VueHowler],
  name: "audioPlayer",
  data() {
    return {
      percentage: 0
    };
  },
  computed: {
    trackProgress() {
      return this.progress * 100;
    },
    durationFmt() {
      return formatTime(this.duration);
    },
    currentTimeFmt() {
      return formatTime(this.duration * this.progress);
    }
  },
  watch: {
    playing() {
      if (!this.playing && this.progress === 0 && this.seek === 0) {
        this.$emit("playerStop");
      }
    }
  },
  methods: {
    setPosition(sliderValue) {
      this.percentage = sliderValue;
      const currentDuration = parseInt((this.duration * this.percentage) / 100);
      this.setSeek(currentDuration);
    },
    stop() {
      console.log("STOP!");
      this.$data._howl.stop();
      this.$emit("playerStop");
    },
    audioEnded(sliderValue) {
      this.percentage = sliderValue;
      // console.log("audio ended");
      this.stop();
    }
  }
};
</script>

但是检查自定义事件'playerStop'的间谍功能没有被调用..

$ yarn test:unit AudioPlayer.spec.js
yarn run v1.9.4
$ vue-cli-service test:unit AudioPlayer.spec.js
 FAIL  tests/unit/AudioPlayer.spec.js
  ✕ should emit playerStop when STOP button is clicked (252ms)
  AudioPlayer.vue
    ✓ should display Play/Pause, Stop, Mute buttons, a slider and a duration text (306ms)

  ● should emit playerStop when STOP button is clicked

    expect(jest.fn()).toHaveBeenCalledTimes(1)

    Expected mock function to have been called one time, but it was called zero times.

      60 |   // await wrapper.vm.$nextTick();
      61 |   // then
    > 62 |   expect(spy).toHaveBeenCalledTimes(1);
         |               ^
      63 | });

我哪里错了?和 vuetify v-btn 的定义有关系吗?

感谢反馈

【问题讨论】:

    标签: vue.js jestjs vuetify.js vue-test-utils


    【解决方案1】:

    已解决...

    我发现我不需要挂载 mixin 来测试我的组件(我没有测试 mixin...)所以在删除它之后...(删除行:// import VueHowler from "vue -howler"; 和 // mixins: [VueHowler] lines ) 那么测试就OK了!!

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 2019-03-17
      • 2019-05-20
      • 2020-07-28
      • 1970-01-01
      • 2019-02-01
      • 2016-07-09
      • 2021-11-13
      • 1970-01-01
      相关资源
      最近更新 更多