首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用元素-ui和vue-test-utils模拟select

使用元素-ui和vue-test-utils模拟select
EN

Stack Overflow用户
提问于 2018-12-12 18:45:34
回答 2查看 4.4K关注 0票数 11

我在Vue中用Jest和Element对包含一个select和2个选项的组件进行单元测试。我从下拉列表中选择一个选项,然后检查是否调用了一个操作。

1)具有普通selectoption HTML标记的--这是很好的工作方式。

// Fruit.vue

代码语言:javascript
复制
<template lang="pug">
  select(
    v-model="fruit"
  )
    option(
      v-for="item in fruits"
      :label="item.label"
      :value="item.value"
    )
</template>
<script>
export default {
  data () {
    return {
      fruits: [
        {
          label: 'Banana',
          value: false
        },
        {
          label: 'Apple',
          value: false
        }
      ]
    }
  },
  computed: {
    fruit: {
      get () {
        return this.$store.state.fruit
      },
      set (fruit) {
        this.$store.dispatch('setSelectedFruit', { fruit })
      }
    }
  }
</script>

// DOM

代码语言:javascript
复制
<select>
  <option label="Banana" value="false"></option>
  <option label="Apple" value="false"></option>
</select>

// Fruit.spec.js

代码语言:javascript
复制
it('calls the "setSelectedFruit" action when a value is selected', () => {
  const wrapper = mount(Fruit, { store, localVue })
  const options = wrapper.find('select').findAll('option')


  options.at(1).setSelected()
  expect(actions.setSelectedFruit).toHaveBeenCalled()
})

但是,我使用元素-ui的el-selectel-option,它们与DOM有自己的交互。

2)el-selectel-option

// Fruit.vue

保持不变,只是selectel-select取代,optionel-option取代。

// DOM

代码语言:javascript
复制
<div class="el-select-dropdown">
  <div class="el-select-dropdown__wrap">
    <ul class="el-select-dropdown__list">
      <li class="el-select-dropdown__item">
        <span>Banana</span>
      </li>
      <li class="el-select-dropdown__item">
        <span>Apple</span>
      </li>
    </ul>
  </div>
</div>

// Fruit.spec.js

a)

代码语言:javascript
复制
it('calls the "setSelectedFruit" action', () => {
  const wrapper = mount(Fruit, { store, localVue })
  const options = wrapper.find('.el-select-dropdown__list').findAll('el-select-dropdown__items')

  options.at(1).setSelected()
  expect(actions.setSelectedFruit).toHaveBeenCalled()
})

b),考虑到setSelected实际上是vue-test-utils文档的别名,我尝试了如下方法:

代码语言:javascript
复制
it('calls the "setSelectedFruit" action', () => {
  const wrapper = mount(Fruit, { store, localVue })
  const options = wrapper.findAll('.el-select-dropdown__item')
  const select = wrapper.find('.el-select-dropdown__list')

  options.at(1).element.selected = false
  select.trigger('change')
  expect(actions.setSelectedFruit).toHaveBeenCalled()
})

对于第二个方法,选择的option被设置为selected,但是select上的触发器不能工作,因此v-model没有更新。

因此,我想知道是否有人有此解决方案,或者是否存在另一个库(vue-test-utils除外),其中元素ui的可以模拟

EN

回答 2

Stack Overflow用户

发布于 2020-11-12 15:15:38

我能够通过触发您想要模拟的下拉项的单击来实现此功能:

代码语言:javascript
复制
wrapper.findAll('.el-select-dropdown__item').at(1).trigger('click');
await Vue.nextTick();
expect(YourExpectStatement);

我需要Vue.nextTick(),因为它允许DOM更新它的循环,更多的这里的信息。还请注意,您需要使测试函数异步化,例如:

代码语言:javascript
复制
it('Async test name', async () => {
票数 1
EN

Stack Overflow用户

发布于 2022-07-01 09:04:48

很难在<el-dropdown><el-select>中触发单击并将下拉项显示出来。然后我试着嘲笑所有这些元素。对我来说很好。

/mock/div.vue

代码语言:javascript
复制
<template>
  <div>
    <slot></slot>
    <slot name="dropdown"></slot>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue'

export default defineComponent({   
  inheritAttrs: true
})
</script>

jest.setup.js

代码语言:javascript
复制
import { config } from '@vue/test-utils'
import Div from './mock/div.vue'
config.global.components = {  
   ElDropdown: Div,
   ElDropdownItem: Div,
   ElDropdownMenu: Div
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53749460

复制
相关文章

相似问题

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