Skip to content
La traduction est synchronisée avec les docs du dont le hash du commit est 644917a.

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 :

js
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 :

js
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 :

js
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.

js
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 :

js
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('£'); });