javascript - vue-test-utils - 如何处理 $refs?

标签 javascript unit-testing vue.js jestjs vue-test-utils

情况

我正在尝试 shallowMount一个组件,不成功。

该组件使用 $refs读取 div 的高度.该值在计算属性中读取。然后在mounted生命周期我将该值保存在商店中。

逻辑本身很简单并且工作正常。但是在测试套件中,组件的安装中断,因为 $refs关键是 undefined .

明确一点:我不打算测试 $refs ,我只需要安装组件并继续进行实际的单元测试。

组件

这是标记:

<div ref="tgmp">

我将 div 的高度保存在计算属性中:
computed: {
  barH() {
    return this.$refs.tgmp.clientHeight
  }
}

然后,在挂载的生命周期中,我提交存储中的值:
this.$store.commit('setBarHeight', this.barH)

测试

这是测试。我省略了不相关的东西,比如在 localVue 中安装商店。
beforeEach(() => {
  wrapper = shallowMount(Bar, {
    store,
  })
})

test('is a Vue instance', () => {
  expect(wrapper.isVueInstance()).toBeTruthy()
})

错误
Error in mounted hook: "TypeError: Cannot read property 'clientHeight' of undefined"

TypeError: Cannot read property 'clientHeight' of undefined

尝试

我一直在尝试在任何地方寻找解决方案,但找不到。
我试图模拟 $refs,但没有成功:
wrapper = shallowMount(ThePlayerBar, {
  store,
  mocks: {
    $refs: {
      tgmp: {
        clientHeight: 600
      }
    }
  }
})

问题

如何安装使我们成为 $refs 的组件在 mounted生命周期?

最佳答案

shallowMount应该提供引用,所以this.$refs.tgmp应该是 <div>万一元素 <div ref="tgmp">存在于初始渲染的 View 中。
$refs不应该被 mock ,因为它是内部属性并在组件初始化时分配。它是依赖于 ref 的计算属性,因此可以在必要时对其进行模拟,因为在 JSDOM 中元素高度应为 0:

jest.spyOn(ThePlayerBar.options.computed, 'barH').mockReturnValue(600);

或者:
  wrapper = shallowMount(Bar, {
    store,
    computed: { barH: () => 600 }
  })

关于javascript - vue-test-utils - 如何处理 $refs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61223992/

相关文章:

vue.js - VueJS 从 API 获取数据后不更新 DOM?

javascript - 如何切换过滤器?

c# - MSTest 显示复合 bool 表达式的部分代码覆盖率

javascript - 避免 JavaScript 测试中的误报

unit-testing - 良好的双重比较容忍度

docker - Docker Compose热重载不适用于vuejs应用

javascript - Vue v-for : iterate one element individually in an array

javascript - jQuery 1.9 和 slideToggle 的问题

javascript - 使用函数 javaScript function createElement(tagName) 创建图形

javascript - 根据选择选项隐藏/显示多个文本字段