Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing Vue.js test:unit和test-utils和Jest:Nested组件-是否可以从子组件模拟$emit(函数)?_Unit Testing_Vue.js_Jestjs_Vue Test Utils - Fatal编程技术网

Unit testing Vue.js test:unit和test-utils和Jest:Nested组件-是否可以从子组件模拟$emit(函数)?

Unit testing Vue.js test:unit和test-utils和Jest:Nested组件-是否可以从子组件模拟$emit(函数)?,unit-testing,vue.js,jestjs,vue-test-utils,Unit Testing,Vue.js,Jestjs,Vue Test Utils,给定嵌套组件 Heading.vue组件 {$t(“lang.views.home.heading.btn_ulisten”)} 弹箭 嵌套的子组件AuioPlayer.vue <template> <div style="display: inline-block;"> <v-btn id="playPauseBtn"> ... </v-btn>

给定嵌套组件

Heading.vue组件 {$t(“lang.views.home.heading.btn_ulisten”)} 弹箭

嵌套的子组件AuioPlayer.vue

     <template>
       <div style="display: inline-block;">
         <v-btn id="playPauseBtn">
           ...
         </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">
           ...
         </v-btn>>
       </div>
     </template>

 <script>
    ...
     methods: {
            stop() {
                this.$data._howl.stop();
                this.$emit("playerStop");
            },
     ...
 </script>
更新

我实现了两个解决方案,但都没有成功

1/使用间谍功能

it("should display LISTEN button on child component audioplayer event stop()", () => {
  // given
  wrapper = shallowMount(Heading, { router, i18n });
  const spy = jest.fn();
  // wrapper.vm.$on('stopPlayer', spy);  // focus on the call of listener
  wrapper.setData({ listening: true });
  const audioplayer = wrapper.find('audioplayer-stub');
  // when
  audioplayer.trigger('stopPlayer');
  // then
  expect(spy).toHaveBeenCalledTimes(1);
  expect(wrapper.vm.listening).toBe(false);
});
2/使用异步$emit()

在这两种情况下,如果我从子组件触发或发射,似乎什么都不会发生…
事实上,emit()应该从子组件中的一个停止按钮执行,该按钮在此级别上没有存根。。 有没有存根? 我想避免坐骑。。。使用shallowMount在这个TET级别应该足够了


感谢您的反馈

已解决。。。这是单元测试vue.js时要避免的陷阱之一:我应该测试什么?而不是测试错误的东西

使用test utils w shallowMount,我不应该测试存根组件中的emi()事件(这应该稍后在此组件中进行测试),我应该只测试将被调用的方法。。。 在这种情况下

方法:{ playerStop(){ 这是错误的; } }

简单测试

  it("method playerStop should tpggle listening to false", async () => {
    // given
    wrapper = shallowMount(Heading, { router, i18n });
    wrapper.setData({ listening: true });
    // when
    wrapper.vm.playerStop();
    const playBtn = wrapper.find('#playBtn')
    // then
    expect(wrapper.vm.listening).toBe(false);
  });

这是正确的,测试可以更好,但代表了这个概念背后的想法。我推荐阅读这篇文章,非常有用。
it("should display LISTEN button on child component audioplayer event stop()", async () => {
  // given
  wrapper = shallowMount(Heading, { router, i18n });
  wrapper.setData({ listening: true });
  const audioplayer = wrapper.find('audioplayer-stub');
  // when
  audioplayer.vm.$emit('stopPlayer');
  await wrapper.vm.$nextTick();
  // then
  expect(wrapper.vm.listening).toBe(false);
});
  it("method playerStop should tpggle listening to false", async () => {
    // given
    wrapper = shallowMount(Heading, { router, i18n });
    wrapper.setData({ listening: true });
    // when
    wrapper.vm.playerStop();
    const playBtn = wrapper.find('#playBtn')
    // then
    expect(wrapper.vm.listening).toBe(false);
  });