Vue 如何测试组件是否发出事件?
How to test if a component emits an event in Vue?
我有两个组成部分。 Child 组件在其值更改时发出 'input' 事件,并且 parent 组件使用 v-model 获取此值。我正在测试 Child 组件。我需要用 Vue-test-utils 编写一个测试来验证它是否有效。
ParentComponent.vue:
<template>
<div>
<child-component v-model="search"></child-component>
<other-component></other-component>
...
</div>
</template>
ChildComponent.vue:
<template>
<input :value="value" @change="notifyChange($event.target.value)"></input>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
@Component
export default class ChildComponent extends Vue {
@Prop({ default: '' }) readonly value!: string
notifyChange(value: string) {
this.$emit('input', value)
}
}
</script>
child-component.spec.ts:
describe('ChildComponent', () => {
let wrapper: any
before(() => {
wrapper = VueTestUtils.shallowMount(ChildComponent, {})
})
it(`Should emit 'input' event when value change`, () => {
const rootWrapper = VueTestUtils.shallowMount(ParentComponent)
wrapper.vm.value = 'Value'
wrapper.findAll('input').at(0).trigger('change')
assert.isTrue(!!rootWrapper.vm.search)
})
})
我没有写完全相同的代码,但逻辑是这样的。
我的组件工作正常。 'child-component.spec.ts' 不起作用。我需要为它写一个测试。
下面是一个可以帮助您的示例:
ChildComponent.vue
<template>
<div>
<h2>{{ numbers }}</h2>
<input v-model="number" type="number" />
<button @click="$emit('number-added', Number(number))">
Add new number
</button>
</div>
</template>
<script>
export default {
name: "ChildComponent",
props: {
numbers: Array
},
data() {
return {
number: 0
};
}
};
</script>
Parent Component.vue
<template>
<div>
<ChildComponent
:numbers="numbers"
@number-added="numbers.push($event)"
/>
</div>
</template>
<script>
import ChildComponent from "./ChildComponent";
export default {
name: "ParentComponent",
data() {
return {
numbers: [1, 2, 3]
};
},
components: {
ChildComponent
}
};
</script>
关注这篇文章:https://medium.com/fullstackio/managing-state-in-vue-js-23a0352b1c87
希望对您有所帮助。
在你的父组件中监听发出的事件"input"
<template>
<div>
<child-component @input="get_input_value" v-model="search"></child-component>
<other-component></other-component>
...
</div>
</template>
并在您的脚本中添加方法 get_input_value()
<script>
...
methods:
get_input_value(value){
console.log(value)
}
</script>
已测试。
如果有人正在寻找这个,这是一种测试发射的简单方法。
在你的测试描述中写这个。
describe('Close Button method', () => {
it('emits return false if button is clicked', (done) => {
wrapper.find('button').trigger('click')
wrapper.vm.$nextTick(() => {
wrapper.vm.closeModal() //closeModal is my method
expect(wrapper.emitted().input[0]).toEqual([false]) //test if it changes
done()
})
})
})
我的 vue 组件
<div v-if="closeButton == true">
<button
@click="closeModal()"
>
...
</button>
</div>
我在 vue comp 中的道具
props: {
value: {
type: Boolean,
default: false
},
我在 vue comp 中的方法
methods: {
closeModal() {
this.$emit('input', !this.value)
}
}
我有两个组成部分。 Child 组件在其值更改时发出 'input' 事件,并且 parent 组件使用 v-model 获取此值。我正在测试 Child 组件。我需要用 Vue-test-utils 编写一个测试来验证它是否有效。
ParentComponent.vue:
<template>
<div>
<child-component v-model="search"></child-component>
<other-component></other-component>
...
</div>
</template>
ChildComponent.vue:
<template>
<input :value="value" @change="notifyChange($event.target.value)"></input>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator'
@Component
export default class ChildComponent extends Vue {
@Prop({ default: '' }) readonly value!: string
notifyChange(value: string) {
this.$emit('input', value)
}
}
</script>
child-component.spec.ts:
describe('ChildComponent', () => {
let wrapper: any
before(() => {
wrapper = VueTestUtils.shallowMount(ChildComponent, {})
})
it(`Should emit 'input' event when value change`, () => {
const rootWrapper = VueTestUtils.shallowMount(ParentComponent)
wrapper.vm.value = 'Value'
wrapper.findAll('input').at(0).trigger('change')
assert.isTrue(!!rootWrapper.vm.search)
})
})
我没有写完全相同的代码,但逻辑是这样的。 我的组件工作正常。 'child-component.spec.ts' 不起作用。我需要为它写一个测试。
下面是一个可以帮助您的示例: ChildComponent.vue
<template>
<div>
<h2>{{ numbers }}</h2>
<input v-model="number" type="number" />
<button @click="$emit('number-added', Number(number))">
Add new number
</button>
</div>
</template>
<script>
export default {
name: "ChildComponent",
props: {
numbers: Array
},
data() {
return {
number: 0
};
}
};
</script>
Parent Component.vue
<template>
<div>
<ChildComponent
:numbers="numbers"
@number-added="numbers.push($event)"
/>
</div>
</template>
<script>
import ChildComponent from "./ChildComponent";
export default {
name: "ParentComponent",
data() {
return {
numbers: [1, 2, 3]
};
},
components: {
ChildComponent
}
};
</script>
关注这篇文章:https://medium.com/fullstackio/managing-state-in-vue-js-23a0352b1c87
希望对您有所帮助。
在你的父组件中监听发出的事件"input"
<template>
<div>
<child-component @input="get_input_value" v-model="search"></child-component>
<other-component></other-component>
...
</div>
</template>
并在您的脚本中添加方法 get_input_value()
<script>
...
methods:
get_input_value(value){
console.log(value)
}
</script>
已测试。 如果有人正在寻找这个,这是一种测试发射的简单方法。 在你的测试描述中写这个。
describe('Close Button method', () => {
it('emits return false if button is clicked', (done) => {
wrapper.find('button').trigger('click')
wrapper.vm.$nextTick(() => {
wrapper.vm.closeModal() //closeModal is my method
expect(wrapper.emitted().input[0]).toEqual([false]) //test if it changes
done()
})
})
})
我的 vue 组件
<div v-if="closeButton == true">
<button
@click="closeModal()"
>
...
</button>
</div>
我在 vue comp 中的道具
props: {
value: {
type: Boolean,
default: false
},
我在 vue comp 中的方法
methods: {
closeModal() {
this.$emit('input', !this.value)
}
}