我在Vue中用Jest和Element对包含一个select和2个选项的组件进行单元测试。我从下拉列表中选择一个选项,然后检查是否调用了一个操作。
1)具有普通select和option HTML标记的--这是很好的工作方式。
// Fruit.vue
<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
<select>
<option label="Banana" value="false"></option>
<option label="Apple" value="false"></option>
</select>// Fruit.spec.js
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-select和el-option,它们与DOM有自己的交互。
2)与el-select和el-option
// Fruit.vue
保持不变,只是select被el-select取代,option被el-option取代。
// DOM
<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)
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文档的别名,我尝试了如下方法:
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的可以模拟。
发布于 2020-11-12 15:15:38
我能够通过触发您想要模拟的下拉项的单击来实现此功能:
wrapper.findAll('.el-select-dropdown__item').at(1).trigger('click');
await Vue.nextTick();
expect(YourExpectStatement);我需要Vue.nextTick(),因为它允许DOM更新它的循环,更多的这里的信息。还请注意,您需要使测试函数异步化,例如:
it('Async test name', async () => {发布于 2022-07-01 09:04:48
很难在<el-dropdown>或<el-select>中触发单击并将下拉项显示出来。然后我试着嘲笑所有这些元素。对我来说很好。
/mock/div.vue
<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
import { config } from '@vue/test-utils'
import Div from './mock/div.vue'
config.global.components = {
ElDropdown: Div,
ElDropdownItem: Div,
ElDropdownMenu: Div
}https://stackoverflow.com/questions/53749460
复制相似问题