Jest + Coverage + VueJs 如何覆盖 vue 方法?

Posted

技术标签:

【中文标题】Jest + Coverage + VueJs 如何覆盖 vue 方法?【英文标题】:Jest + Coverage + VueJs how to cover vue methods? 【发布时间】:2021-06-25 04:25:03 【问题描述】:

我试图覆盖代码以增加覆盖率 报告百分比,

如何覆盖 vue 方法中的 if 语句?

在我使用 @vue/test-utils:"^1.1.4"vue: "^2.6.12" 包版本的情况下,仅供参考,以下是我的实际组件,

<template>   
    <div :class="iconcls" >
        <el-image 
            ref='cal-modal'
            class="icons" 
            @click="handleRedirectRouter(urlname)"
            :src="require(`@/assets/designsystem/home/$iconurl`)" 
            fit="fill" />
        <div class="desc" > icondesc </div>
    </div>
</template>

<script lang="ts">
import  Component, Vue, Prop  from 'vue-property-decorator';

@Component(
  components: 
)
class IconHolder extends Vue 
    @Prop( default: "" ) iconcls!: any;
    @Prop( default: "" ) iconurl!: any;
    @Prop( default: "" ) icondesc!: any;
    @Prop( default: "" ) urlname!: any;

    handleRedirectRouter(url: string) 
        if (url !== "") 
            this.$router.push( name: url );
        
    


export default IconHolder;
</script>

Iconholder.vue 组件的覆盖率报告

编辑 2:Ater @tony 更新,

我已经尝试过以下测试,但仍然出现错误,

import Vue from "vue";
import Vuex from "vuex";
import IconHolder from '@/components/designsystem/Home/IconHolder.vue';
import ElementUI,  Image  from "element-ui";
import  mount, createLocalVue  from '@vue/test-utils';
const localVue = createLocalVue();
localVue.use(Vuex);
localVue.use(ElementUI, 
    Image
);

Vue.component('el-image', Image);

describe("IconHolder.spec.vue", () => 

    it('pushes route by name', async () => 
        const push = jest.fn();      
        const wrapper = mount(IconHolder, 
          propsData: 
            iconcls:"dshomesec5_comp_icons",
            icondesc:"about",
            iconurl:"components_icn_15.svg",
            urlname: 'about'
          ,
          mocks: 
            $router: 
              push
            
          
        )
        await wrapper.findComponent( name: 'el-image' ).trigger('click');
        expect(push).toHaveBeenCalledWith( name: 'about' );
    )    

) 

错误报告:

expect(jest.fn()).toHaveBeenCalledWith(...expected)

Expected: "name": "about"

Number of calls: 0

  30 |         )
  31 |         await wrapper.findComponent( name: 'el-image' ).trigger('click');
> 32 |         expect(push).toHaveBeenCalledWith( name: 'about' )

【问题讨论】:

【参考方案1】:

使用url 的非空字符串创建一个运行该方法的单元测试。

    使用initial non-empty urlname prop 安装组件。 Mock the $router.push method 和 jest.fn(),稍后我们将使用它来验证调用。 绑定到该方法的Find the el-image component(作为click 处理程序)。 Trigger 该组件上的 click 事件。 Verify $router.push was called 与指定的urlname
it('pushes route by name', () => 
  /* 2 */
  const push = jest.fn()

  const wrapper = shallowMount(IconHolder, 
    /* 1 */
    propsData: 
      urlname: 'about'
    ,
    /* 2 */
    mocks: 
      $router: 
        push
      
    
  )

                 /* 3 ?*/                            /* 4 ?*/
  await wrapper.findComponent( name: 'el-image' ).trigger('click')

  /* 5 */
  expect(push).toHaveBeenCalledWith( name: 'about' )
)

【讨论】:

嘿兄弟,我已经更新了我上面的测试套件,仍然遇到类似上面的错误,请帮我解决这个问题。 "vue": "^2.6.12", "@vue/test-utils": "^1.1.4", 您能否发布一个指向重现该问题的项目的链接? 我正在寻找一个能够重现您在运行单元测试时看到的错误的项目。您链接的项目只是给了我应用程序代码。 错误报告已经在我更新的查询本身之上。

以上是关于Jest + Coverage + VueJs 如何覆盖 vue 方法?的主要内容,如果未能解决你的问题,请参考以下文章

jest 的 coverage 提示 unknown 的解决方案

当您运行 jest --coverage 时,Branches 列的作用/含义是啥?

如何在 jest 测试用例 +VueJS +Jest 中更改 $route

VueJS / Jest:模拟多个获取响应

使用 Jest 在 VueJS 组件中模拟自定义模块

Webpack 代码拆分使用 vueJs 组件中断 jest 导入