首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vue-test-utils返回document.querySelector的空值。

vue-test-utils返回document.querySelector的空值。
EN

Stack Overflow用户
提问于 2021-01-11 09:41:51
回答 1查看 1.6K关注 0票数 1

我正在为一个Vue.js组件编写单元测试,该组件显示一些无线电按钮,并在检查按钮时发出带有单选按钮id的事件:

ApplicationElement.vue:

代码语言:javascript
复制
<template>
  <div id="element">
    <label>
      <input
        type="radio"
        name="Element"
        id="element1"
        v-on:change="chooseElement"
      />
      Element1
    </label>
    <label>
      <input
        type="radio"
        name="Element"
        id="element2"
        v-on:change="chooseElement"
      />
      Element2
    </label>
    <label>
      <input
        type="radio"
        name="Element"
        id="element3"
        v-on:change="chooseElement"
      />
      Element3
    </label>
    <label>
      <input
        type="radio"
        name="Element"
        id="element4"
        v-on:change="chooseElement"
      />
      Element4
    </label>
  </div>
</template>

<script>
export default {
  methods: {
    chooseElement () {
      var chosenElement = document.querySelector('input[name="Element"]:checked').id
      this.$emit('passChosenElement', {category: chosenElement})
    }
  }
}
</script>

<style>
</style>

我为上述组件编写了以下测试:

ApplicationElement.spec.js:

代码语言:javascript
复制
import { shallowMount, createLocalVue } from '@vue/test-utils'
import 'regenerator-runtime/runtime'
import ApplicationElement from '@/components/ApplicationElement.vue'

const localVue = createLocalVue()

describe('ApplicationElement tests', () => {
    it('should emit event with element1 parameter on corresponding radio button choice', async() => {
        const wrapper = shallowMount(ApplicationElement, {
            localVue,
            attachTo: document.body,
            propsData: {
                recursionNumber: 1
            }
        })
        await wrapper.find('input[type="radio"][id="element1"]').setChecked()
        expect(wrapper.emitted().passChosenElement[0]).toEqual([{element: 'element1'}])
        wrapper.destroy()
    })
})

如果我从组件中的方法中删除document.querySelector行并手动发出正确的id,则测试将失败。

如何让document.querySelector使用vue-test-utils?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-03 15:45:38

我知道,这个问题已经有点老了,但我终于找到了一个解决方案这里。您需要使用attachTo (自2021年5月起)将组件附加到html元素。解决方案如下:

代码语言:javascript
复制
describe('ApplicationElement tests', () => {
  it('should emit event with element1 parameter on corresponding radio button choice', async() => {
      const elem = document.createElement('div')
      if (document.body) {
         document.body.appendChild(elem)
      }

      const wrapper = shallowMount(ApplicationElement, {
          localVue,
          propsData: {
              recursionNumber: 1
          },
          attachTo: elem,
      })
      await wrapper.find('input[type="radio"][id="element1"]').setChecked()
      expect(wrapper.emitted().passChosenElement[0]).toEqual([{element: 'element1'}])
      wrapper.destroy()
  })
});

正如您已经做的那样,在每次测试之后调用wrapper.destroy()是很重要的。小重构技巧:将wrapper.destroy()放入afterEach回调函数中。在这里,您可以找到更多关于attachTo的信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65664412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档