Vue中的浅安装,存根不起作用

Posted

技术标签:

【中文标题】Vue中的浅安装,存根不起作用【英文标题】:Shallow mounting in Vue, stubs not working 【发布时间】:2020-09-04 02:38:58 【问题描述】:

我想为一个渲染子组件的 Vue 组件编写一个 Jest 测试。该组件如下所示:

<template>
  <div class="add-to-cart-position">
    <a :href="item.url">
      <picture-comp
        class="add-to-cart-position__image"
        :srcset-mobile="item.imageUrlMobile"
        :srcset-desktop="item.imageUrl"
      />
    </a>
  </div>
</template>

<script lang="ts">
  import Vue, Component, Prop from 'vue-property-decorator';
  import BasketItem from '../interfaces/BasketItem';
  import PictureComp from '../pictureComp/pictureComp.vue';

  @Component(
    name: 'add-to-cart-position',
    components: 
      PictureComp
    
  )
  export default class AddToCartPosition extends Vue 
    @Prop()
    item: BasketItem;
  
</script>

根据docs 我可以使用shallowMount 自动存根所有子组件,这正是我想要的。所以我的测试看起来像这样:

import shallowMount from '@vue/test-utils';
import AddToCartPosition from 'AddToCartPosition.vue';
import mockBasketItem from '/__mocks__/data/basketItem.mock';

describe('addToCartPosition', () => 
  const wrapper = shallowMount(AddToCartPosition, 
    propsData: 
      basketItem: mockBasketItem()
    
  );

  it('matches the snapshot', () => 
    expect(wrapper.html()).toMatchSnapshot();
  );
);

但是当我运行这个测试时,我得到一个错误并且错误在PictureComp 子组件中,它根本不应该被渲染。为什么自动存根不起作用?

我也尝试了mount 和手动存根,但它并没有改变任何东西。错误消息保持不变。

错误信息:

Test suite failed to run

TypeError: Object prototype may only be an Object or null: undefined
    at setPrototypeOf (<anonymous>)

  34 |       >
  35 |       <source
> 36 |         :srcset="srcLg"
     |            ^
  37 |         media="(min-width: 767px)"
  38 |       >
  39 |       <img

  at extendStatics (pictureComp/pictureComp.vue:36:12)
  at Object.<anonymous>.__extends (pictureComp/pictureComp.vue:40:5)
  at pictureComp/pictureComp.vue:62:1
  at pictureComp/pictureComp.vue:105:1
  at Object.<anonymous> (pictureComp/pictureComp.vue:137:3)
  at addToCartPosition/addToCartPosition.vue:70:1
  at Object.<anonymous> (addToCartPosition/addToCartPosition.vue:106:3)
  at Object.<anonymous> (test/components/addToCartPosition.test.ts:2:1)

【问题讨论】:

由于 pictureComp 渲染,该错误并不明显。由于您使用的是 shallowMount,我希望它不会。该错误可能发生在 pictureComp 导入时,并且 shallowMount 无能为力。请提供图片Comp.vue,因为它是相关的。 这是正确的。错误确实在子组件中 - 不是在渲染它时,而是在导入时。错误消息非常非常具有误导性。 很高兴您解决了这个问题。 extendStatics 和 setPrototypeOf 表明在定义类时会发生这种情况。有意义,因为您使用的是类组件。 【参考方案1】:

我花了很长时间才理解,但我最终明白了你对问题的 cmets 的意思。

对我来说,这是我需要set an environment variable,因为我的一个模块期望引用一个不存在的值。

在运行导入命令时会检查这一点,即使当您安装组件时,由于某种形式的测试替身,不需要导入。

【讨论】:

就我而言,这是一个关于 Vue、Jest 和 Typescript 的问题,如下所示:***.com/questions/48992278/… Jest 和 TS 不喜欢 Vue 默认导出。所有组件都需要一点额外的照顾。

以上是关于Vue中的浅安装,存根不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Vue安装但-v和create不起作用

vue中的计算属性不起作用

为啥我在 Vue 中的移动标签效果不起作用?

为啥我在 vue.js 中的自定义搜索过滤器不起作用?

附加的html中的vue onclick函数不起作用

Vue js,引导程序。表格中的过渡效果不起作用