在 Vue 中设置包装器对象的子组件的道具
Setting the props of a child component of a wrapper object in Vue
我正在使用 vue-test-util
为我制作的组件编写一些测试。我已将我的代码归结为实际问题。
组件的形式为:
<template>
<inner-component>
</template>
<script>
export default {
name: 'MyList'
}
</script>
我的内部组件看起来像这样:
<template>
<div v-if="open">Some stuff</div>
</template>
<script>
export default {
name: 'InnerComponent',
props: {
open: false,
}
}
</script>
现在我正在编写的测试是在 open
属性设置为 true
时测试 inner-component
中是否存在 div
,但是它默认设置为 false
。在测试之前,我需要一种方法来设置这个子组件的 prop。
我的测试:
import { createLocalVue, mount } from '@vue/test-utils'
import MyList from '@/components/MyList.vue'
describe('My Test', () => {
const localVue = createLocalVue()
const wrapper = mount(MyList)
it('Tests', () => {
// need to set the prop here
expect(wrapper.find('div').exists()).toBeTruthy()
}
}
我可以使用:
wrapper.vm.$children[0].$options.propsData.open = true
似乎设置了 prop,但我的测试仍然出现错误。
我可以更改组件,使默认值为真,然后我的测试通过,所以我认为这不是我正在检查的方式。
如果有人知道为什么这不起作用或知道更好的方法,请告诉我!
通过 vue-test-util
您可以使用包装器中的方法 setProps
,查看相关文档 here
例如
const wrapper = mount(Foo)
wrapper.setProps({ foo: 'bar' })
根据 guide:
vm.$options
The instantiation options used for the current Vue instance.
所以,$options
不是我们在props
中写的。
使用$props
为子组件设置属性:
wrapper.vm.$children[0].$props.open = true
但是这样会导致警告:
Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value.
所以,让我们听从建议,将子组件的属性与父组件的数据绑定起来。这里我用 isOpen
变量绑定它:
<template>
<inner-component :open='isOpen'></inner-component>
</template>
<script>
import InnerComponent from '@/components/InnerComponent.vue'
export default {
name: 'MyList',
data() {
return {
isOpen: false
}
},
components:{InnerComponent}
}
</script>
然后在你的测试中,当你想改变子组件中open
属性的值时,你可以只改变isOpen
的值:
wrapper.setData({isOpen:true})
我正在使用 vue-test-util
为我制作的组件编写一些测试。我已将我的代码归结为实际问题。
组件的形式为:
<template>
<inner-component>
</template>
<script>
export default {
name: 'MyList'
}
</script>
我的内部组件看起来像这样:
<template>
<div v-if="open">Some stuff</div>
</template>
<script>
export default {
name: 'InnerComponent',
props: {
open: false,
}
}
</script>
现在我正在编写的测试是在 open
属性设置为 true
时测试 inner-component
中是否存在 div
,但是它默认设置为 false
。在测试之前,我需要一种方法来设置这个子组件的 prop。
我的测试:
import { createLocalVue, mount } from '@vue/test-utils'
import MyList from '@/components/MyList.vue'
describe('My Test', () => {
const localVue = createLocalVue()
const wrapper = mount(MyList)
it('Tests', () => {
// need to set the prop here
expect(wrapper.find('div').exists()).toBeTruthy()
}
}
我可以使用:
wrapper.vm.$children[0].$options.propsData.open = true
似乎设置了 prop,但我的测试仍然出现错误。
我可以更改组件,使默认值为真,然后我的测试通过,所以我认为这不是我正在检查的方式。
如果有人知道为什么这不起作用或知道更好的方法,请告诉我!
通过 vue-test-util
您可以使用包装器中的方法 setProps
,查看相关文档 here
例如
const wrapper = mount(Foo)
wrapper.setProps({ foo: 'bar' })
根据 guide:
vm.$options
The instantiation options used for the current Vue instance.
所以,$options
不是我们在props
中写的。
使用$props
为子组件设置属性:
wrapper.vm.$children[0].$props.open = true
但是这样会导致警告:
Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value.
所以,让我们听从建议,将子组件的属性与父组件的数据绑定起来。这里我用 isOpen
变量绑定它:
<template>
<inner-component :open='isOpen'></inner-component>
</template>
<script>
import InnerComponent from '@/components/InnerComponent.vue'
export default {
name: 'MyList',
data() {
return {
isOpen: false
}
},
components:{InnerComponent}
}
</script>
然后在你的测试中,当你想改变子组件中open
属性的值时,你可以只改变isOpen
的值:
wrapper.setData({isOpen:true})