如何在vue-test-utils中为子vue组件设置数据?
How to set data for the child vue component in vue-test-utils?
我有一个 FileForm.vue 组件:-
<template>
<div class="file-form">
<form @submit="submit">
<input v-model="name" type="text" placeholder="File Name" />
<button type="submit">
<i class="fas fa-plus"></i>
</button>
</form>
</div>
</template>
<script>
export default {
data () {
return {
name: ''
}
},
methods: {
submit () {
if (!this.name.trim()) {
return
}
this.$emit('submit', this.name)
}
}
}
</script>
它包含在App.vue组件中:-
<template>
<div class="main">
<div class="sidebar">
<file-form @submit="createFile"></file-form>
<div class="files-list">
</div>
</div>
<div class="content">
<editor v-model="content"></editor>
<renderer :markdown="content"></renderer>
</div>
</div>
</template>
现在我正在测试这个行为:-
test('on successfull submit of the FileForm.vue a file object should be pushed to files array of App.vue', () => {
let appWrapper = mount(App)
appWrapper.setMethods({
createFile: jest.fn()
})
appWrapper.find('form').trigger('submit')
expect(appWrapper.vm.createFile).toHaveBeenCalled()
})
它会失败,因为最初 FileForm.vue 的输入是空的,所以它的数据名称 属性,它不会因为 if 块而触发提交操作。因此模拟的 createFile 没有被调用。
如果我能以某种方式设置数据,在这种情况下,在触发提交之前设置 FileForm.vue 的名称 属性,我的测试就会通过。像这样:-
let formWrapper = appWrapper.find('file-form')
formWrapper.setData({
name: 'New File'
})
但我不能这样做,因为 formWrapper 是一个 HTMLElement 而不是 Vue 实例。
使用
import FileForm from '@/components/FileForm'
let formWrapper = appWrapper.find(FileForm)
formWrapper.setData({
// your code here
})
我有一个 FileForm.vue 组件:-
<template>
<div class="file-form">
<form @submit="submit">
<input v-model="name" type="text" placeholder="File Name" />
<button type="submit">
<i class="fas fa-plus"></i>
</button>
</form>
</div>
</template>
<script>
export default {
data () {
return {
name: ''
}
},
methods: {
submit () {
if (!this.name.trim()) {
return
}
this.$emit('submit', this.name)
}
}
}
</script>
它包含在App.vue组件中:-
<template>
<div class="main">
<div class="sidebar">
<file-form @submit="createFile"></file-form>
<div class="files-list">
</div>
</div>
<div class="content">
<editor v-model="content"></editor>
<renderer :markdown="content"></renderer>
</div>
</div>
</template>
现在我正在测试这个行为:-
test('on successfull submit of the FileForm.vue a file object should be pushed to files array of App.vue', () => {
let appWrapper = mount(App)
appWrapper.setMethods({
createFile: jest.fn()
})
appWrapper.find('form').trigger('submit')
expect(appWrapper.vm.createFile).toHaveBeenCalled()
})
它会失败,因为最初 FileForm.vue 的输入是空的,所以它的数据名称 属性,它不会因为 if 块而触发提交操作。因此模拟的 createFile 没有被调用。
如果我能以某种方式设置数据,在这种情况下,在触发提交之前设置 FileForm.vue 的名称 属性,我的测试就会通过。像这样:-
let formWrapper = appWrapper.find('file-form')
formWrapper.setData({
name: 'New File'
})
但我不能这样做,因为 formWrapper 是一个 HTMLElement 而不是 Vue 实例。
使用
import FileForm from '@/components/FileForm'
let formWrapper = appWrapper.find(FileForm)
formWrapper.setData({
// your code here
})