Tester v-model
Lors de l'écriture de composants qui dépendent de l'interaction v-model
(évènement update:modelValue
), vous devez gérer l'event
et les props
.
Vous pouvez jeter un œil sur la discussion intégration de v-model
pour des solutions apportées par la communauté.
Vous pouvez aussi regarder la documentation v-model
VueJS.
Un Exemple Simple
Ci-dessous un composant simple Editor
:
const Editor = { props: { label: String, modelValue: String, }, emits: ['update:modelValue'], template: `<div> <label>{{label}}</label> <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)"> </div>`, };
Ce composant se comportera comme un composant input
:
const App = { components: { Editor, }, template: `<editor v-model="text" label="test" />`, data(){ return { text: 'test', }; }, };
Maintenant que nous avons typé notre input
, il modifiera la propriété texte
dans notre composant.
Pour tester ce comportement :
test('modelValue est modifié', async () => { const wrapper = mount(Editor, { props: { modelValue: 'Texte initial', 'onUpdate:modelValue': (e) => wrapper.setProps({ modelValue: e }), }, }); await wrapper.find('input').setValue('test'); expect(wrapper.props('modelValue')).toBe('test'); });
Plusieurs v-model
Dans certaines situations, nous pouvons avoir plusieurs v-model
ciblant des propriétés spécifiques.
Par exemple, dans un éditeur de transactions financières, nous pouvons avoir des propriétés currency
et modelValue
.
const MoneyEditor = { template: `<div> <input :value="currency" @input="$emit('update:currency', $event.target.value)"/> <input :value="modelValue" type="number" @input="$emit('update:modelValue', $event.target.value)"/> </div>`, props: ['currency', 'modelValue'], emits: ['update:currency', 'update:modelValue'], };
Nous pouvons tester les deux comme ceci :
test('modelValue et currency sont modifiés', async () => { const wrapper = mount(MoneyEditor, { props: { modelValue: 'Texte inital', 'onUpdate:modelValue': (e) => wrapper.setProps({ modelValue: e }), currency: '€', 'onUpdate:currency': (e) => wrapper.setProps({ currency: e }), }, }); const [currencyInput, modelValueInput] = wrapper.findAll('input'); await modelValueInput.setValue('test'); await currencyInput.setValue('£'); expect(wrapper.props('modelValue')).toBe('test'); expect(wrapper.props('currency')).toBe('£'); });