Introducció
Les proves unitàries són una part essencial del desenvolupament de programari, ja que ens permeten assegurar-nos que les nostres unitats de codi funcionen correctament de manera aïllada. En el context de Vue.js, Vue Test Utils és una biblioteca oficial que facilita la creació de proves unitàries per a components Vue.
Objectius
En aquesta secció, aprendràs a:
- Configurar Vue Test Utils en un projecte Vue.
- Escriure proves unitàries bàsiques per a components Vue.
- Utilitzar mocks i espies per a proves més avançades.
Configuració de Vue Test Utils
Instal·lació
Per començar a utilitzar Vue Test Utils, primer hem d'instal·lar la biblioteca juntament amb un framework de proves com Jest o Mocha. En aquest exemple, utilitzarem Jest.
Configuració de Jest
Crea un fitxer de configuració per a Jest (jest.config.js
) a l'arrel del teu projecte:
module.exports = { preset: '@vue/cli-plugin-unit-jest/presets/no-babel', testMatch: ['**/__tests__/**/*.spec.[jt]s?(x)'], };
Afegeix un script al teu package.json
per executar les proves:
Escriure la primera prova unitària
Component a provar
Suposem que tenim un component senzill HelloWorld.vue
:
<template> <div> <h1>{{ msg }}</h1> </div> </template> <script> export default { name: 'HelloWorld', props: { msg: String } } </script>
Creant el fitxer de prova
Crea un fitxer de prova per a HelloWorld.vue
a la carpeta __tests__
:
// __tests__/HelloWorld.spec.js import { shallowMount } from '@vue/test-utils'; import HelloWorld from '@/components/HelloWorld.vue'; describe('HelloWorld.vue', () => { it('renderitza el missatge passat per prop', () => { const msg = 'Hola, Vue!'; const wrapper = shallowMount(HelloWorld, { propsData: { msg } }); expect(wrapper.text()).toMatch(msg); }); });
Explicació del codi
shallowMount
: Aquesta funció de Vue Test Utils crea una instància superficial del component, sense muntar els components fills.propsData
: Passa les propietats necessàries al component.wrapper.text()
: Obté el text renderitzat pel component.expect(wrapper.text()).toMatch(msg)
: Comprova que el text renderitzat coincideixi amb el missatge passat per prop.
Utilitzant mocks i espies
Component amb una crida a una API
Suposem que tenim un component UserProfile.vue
que fa una crida a una API per obtenir dades d'usuari:
<template> <div> <p>{{ user.name }}</p> </div> </template> <script> export default { name: 'UserProfile', data() { return { user: {} }; }, async created() { const response = await fetch('https://api.example.com/user'); this.user = await response.json(); } } </script>
Creant el fitxer de prova amb mocks
// __tests__/UserProfile.spec.js import { shallowMount } from '@vue/test-utils'; import UserProfile from '@/components/UserProfile.vue'; global.fetch = jest.fn(() => Promise.resolve({ json: () => Promise.resolve({ name: 'John Doe' }) }) ); describe('UserProfile.vue', () => { it('renderitza el nom de l\'usuari després de la crida a l\'API', async () => { const wrapper = shallowMount(UserProfile); await wrapper.vm.$nextTick(); expect(wrapper.text()).toContain('John Doe'); }); });
Explicació del codi
global.fetch
: Mock de la funciófetch
per simular una crida a l'API.jest.fn()
: Crea una funció simulada que retorna una promesa resolta amb les dades de l'usuari.await wrapper.vm.$nextTick()
: Espera que el cicle de vida del component es completi abans de fer les comprovacions.
Exercicis pràctics
Exercici 1: Provar un component amb una entrada de text
Crea un component TextInput.vue
que tingui una entrada de text i un botó. Quan es faci clic al botó, el text de l'entrada s'ha de mostrar en un paràgraf.
<template> <div> <input v-model="text" /> <button @click="showText">Mostrar Text</button> <p v-if="displayText">{{ displayText }}</p> </div> </template> <script> export default { data() { return { text: '', displayText: '' }; }, methods: { showText() { this.displayText = this.text; } } } </script>
Escriu una prova unitària per assegurar-te que el text es mostra correctament quan es fa clic al botó.
Solució
// __tests__/TextInput.spec.js import { shallowMount } from '@vue/test-utils'; import TextInput from '@/components/TextInput.vue'; describe('TextInput.vue', () => { it('mostra el text quan es fa clic al botó', async () => { const wrapper = shallowMount(TextInput); const input = wrapper.find('input'); input.setValue('Hola, món!'); await wrapper.find('button').trigger('click'); expect(wrapper.find('p').text()).toBe('Hola, món!'); }); });
Conclusió
En aquesta secció, hem après a configurar Vue Test Utils i Jest per a proves unitàries en un projecte Vue. Hem escrit proves unitàries bàsiques per a components Vue i hem utilitzat mocks per simular crides a APIs. Les proves unitàries són una eina poderosa per assegurar la qualitat del codi i facilitar el manteniment a llarg termini.
En la següent secció, explorarem les proves de punta a punta amb Cypress per assegurar-nos que les nostres aplicacions Vue funcionen correctament en un entorn real.
Curs de Vue.js
Mòdul 1: Introducció a Vue.js
- Què és Vue.js?
- Configuració de l'entorn de desenvolupament
- Creant la teva primera aplicació Vue
- Entenent la instància de Vue
Mòdul 2: Conceptes bàsics de Vue.js
- Sintaxi de plantilles
- Enllaç de dades
- Propietats computades i observadors
- Enllaços de classes i estils
- Renderització condicional
- Renderització de llistes
Mòdul 3: Components de Vue.js
- Introducció als components
- Props i esdeveniments personalitzats
- Slots
- Components dinàmics i asíncrons
- Comunicació entre components
Mòdul 4: Vue Router
- Introducció a Vue Router
- Configuració de Vue Router
- Rutes dinàmiques
- Rutes niades
- Guàrdies de navegació
Mòdul 5: Gestió d'estat amb Vuex
- Introducció a Vuex
- Estat, getters, mutacions i accions
- Mòduls a Vuex
- Utilitzant Vuex en components
- Patrons avançats de Vuex
Mòdul 6: Directives de Vue.js
Mòdul 7: Plugins de Vue.js
Mòdul 8: Proves en Vue.js
Mòdul 9: Conceptes avançats de Vue.js
- Funcions de renderització i JSX
- Renderització del costat del servidor (SSR) amb Nuxt.js
- API de composició de Vue 3
- Optimització del rendiment