在 Vue 3 的 Jest 测试中模拟 vue-router 的 useRoute()

Posted

技术标签:

【中文标题】在 Vue 3 的 Jest 测试中模拟 vue-router 的 useRoute()【英文标题】:Mocking vue-router's useRoute() in Jest tests in Vue 3 【发布时间】:2021-03-20 22:01:32 【问题描述】:

我在我的应用程序中使用 Vue 3 和 Vue-Router,但在使用 Jest 在使用 useRoute() 的组件上创建单元测试时遇到了问题,例如:

<template>
    <div :class=" 'grey-background': !isHomeView " />
</template>

<script lang="ts">
import  defineComponent, computed  from 'vue';
import  useRoute  from 'vue-router';

export default defineComponent(
    setup: () => 
        const isHomeView = computed(() => 
            return useRoute().name === 'Home';
        );

        return 
            isHomeView,
        ;
    ,
);
</script>

computed 属性正在使用useRoute(),并且在模板中使用。 当我对此组件进行 Jest 测试时,会抛出一个错误,提示 TypeError: Cannot read property 'name' of undefined

我试着像这样嘲笑useRoutejest.mock('vue-router', () =&gt; ( useRoute: jest.fn() )); 然后上beforeEachuseRoute.mockReturnValueOnce( name: 'Home' );,但它不起作用。

我不是在谈论路由器工作方式不同的 Vue 2,而是 Vue 3。

【问题讨论】:

【参考方案1】:

问题是你的工厂函数(即 useRoute: jest.fn() )没有指定模拟返回(即,它返回undefined),所以useRoute().name试图从undefined访问name,这会生成你提到的错误。

您可以更新模拟工厂以返回具有name 属性的对象:

jest.mock('vue-router', () => (
  useRoute: jest.fn(() => ( name: 'Home' ))
))

...或者在测试中模拟它们而不是使用工厂:

jest.mock('vue-router')

describe('MyFoo.vue', () => 

  it('should have grey background for Home view', () => 
    require('vue-router').useRoute.mockReturnValueOnce( name: 'Home' )
    const wrapper = shallowMount(MyFoo)
    expect(wrapper.html()).not.toContain('grey-background')
  )

  it('should not have grey background for non-Home view', () => 
    require('vue-router').useRoute.mockReturnValueOnce( name: 'About' )
    const wrapper = shallowMount(MyFoo)
    expect(wrapper.html()).toContain('grey-background')
  )
)

【讨论】:

以上是关于在 Vue 3 的 Jest 测试中模拟 vue-router 的 useRoute()的主要内容,如果未能解决你的问题,请参考以下文章

如何在单元测试期间使用 vue-test-utils 和 jest 模拟 mixin?

在 vue-multiselect 中测试 vuex 操作时调用了 Jest 预期的模拟函数

使用 Jest 测试 Vue3 组件时如何模拟计算属性

在使用 jest 的 vue 测试中找不到模块“@jest/globals”

如何在 Jest 单元测试中模拟在 `created` Vue 生命周期挂钩中调用的方法,而不使用`shallowMount` 中已弃用的`methods` 参数? [复制]

使用 Jest 在 Vue 中为组件中的方法编写单元测试