J'ai deux composants. Le composant enfant émet un événement 'input' lorsque sa valeur est modifiée et que le composant parent prend cette valeur avec v-model. Je teste ChildComponent. J'ai besoin d'écrire un test avec Vue-test-utils pour vérifier que cela fonctionne.
ParentComponent.vue:
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) }) })
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:
<template> <div> <child-component v-model="search"></child-component> <other-component></other-component> ... </div> </template>
Je n'ai pas écrit exactement le même code mais la logique est la suivante. Mes composants fonctionnent correctement. 'child-component.spec.ts' ne fonctionne pas. J'ai besoin d'écrire un test pour cela.
3 Réponses :
Voici un exemple qui vous aidera: Child 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>
Parent Component.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>
Suivez cet article: https://medium.com/fullstackio/managing-state-in-vue-js-23a0352b1c87 p >
J'espère que cela vous aidera.
Merci pour votre réponse mais mes composants fonctionnent également correctement. Le problème est que je ne peux pas écrire un test pour vérifier.
dans votre composant parent, écoutez l'événement émis "input"
<script> ... methods: get_input_value(value){ console.log(value) } </script>
et dans votre script, ajoutez la méthode get_input_value ()
<template> <div> <child-component @input="get_input_value" v-model="search"></child-component> <other-component></other-component> ... </div> </template>
p >
Comment écrire un test pour vérifier que le composant enfant émet réellement cet événement?
TESTÉ. C'est un moyen simple de tester une émission, si quelqu'un le cherche. dans votre test décrivez, écrivez ceci.
methods: { closeModal() { this.$emit('input', !this.value) } }
ma vue comp
props: { value: { type: Boolean, default: false },
mes accessoires dans vue comp
<div v-if="closeButton == true"> <button @click="closeModal()" > ... </button> </div>