En aquest tema, aprendrem com simular dependències en les proves de les nostres aplicacions Vue.js. La simulació de dependències és una tècnica crucial per a les proves unitàries, ja que ens permet aïllar el codi que estem provant i assegurar-nos que les proves són fiables i repetibles.
Objectius del tema
- Entendre què és la simulació de dependències i per què és important.
- Aprendre a utilitzar
jest.mock
per simular mòduls. - Veure exemples pràctics de simulació de dependències en components Vue.
- Realitzar exercicis pràctics per reforçar els conceptes apresos.
Què és la simulació de dependències?
La simulació de dependències (mocking) és el procés de substituir parts del sistema que estem provant amb versions controlades que imiten el comportament de les dependències reals. Això ens permet:
- Aïllar el codi que estem provant.
- Controlar l'entorn de prova.
- Evitar efectes secundaris no desitjats.
- Millorar la velocitat de les proves.
Utilitzant jest.mock
per simular mòduls
Jest és un dels marcs de proves més populars per a aplicacions JavaScript, i proporciona una funcionalitat integrada per simular mòduls. Vegem com podem utilitzar jest.mock
per simular un mòdul.
Exemple pràctic
Suposem que tenim un mòdul api.js
que fa una crida a una API externa:
// api.js export const fetchData = async () => { const response = await fetch('https://api.example.com/data'); return response.json(); };
I tenim un component Vue que utilitza aquest mòdul:
// MyComponent.vue <template> <div> <p v-if="data">{{ data }}</p> <p v-else>Loading...</p> </div> </template> <script> import { fetchData } from './api'; export default { data() { return { data: null, }; }, async created() { this.data = await fetchData(); }, }; </script>
Per provar aquest component, volem simular la funció fetchData
per evitar fer una crida real a l'API. Aquí teniu com ho podem fer:
// MyComponent.test.js import { shallowMount } from '@vue/test-utils'; import MyComponent from './MyComponent'; import { fetchData } from './api'; // Simulem el mòdul api.js jest.mock('./api', () => ({ fetchData: jest.fn(), })); describe('MyComponent', () => { it('mostra les dades després de carregar', async () => { // Definim el comportament de la funció simulada fetchData.mockResolvedValue({ message: 'Hello, world!' }); const wrapper = shallowMount(MyComponent); // Esperem que el component es carregui await wrapper.vm.$nextTick(); // Comprovem que les dades es mostren correctament expect(wrapper.text()).toContain('Hello, world!'); }); });
Explicació del codi
- Simulació del mòdul: Utilitzem
jest.mock
per simular el mòdulapi.js
. Això ens permet definir el comportament de la funciófetchData
dins de les nostres proves. - Definició del comportament de la funció simulada: Utilitzem
fetchData.mockResolvedValue
per especificar que la funció simulada ha de retornar{ message: 'Hello, world!' }
quan es cridi. - Prova del component: Muntem el component amb
shallowMount
i esperem que es carregui ambawait wrapper.vm.$nextTick()
. Finalment, comprovem que el text del component contéHello, world!
.
Exercicis pràctics
Exercici 1: Simulació d'una funció de mòdul
- Crea un mòdul
userService.js
amb una funciógetUser
que retorni un objecte d'usuari. - Crea un component Vue que utilitzi aquesta funció per mostrar el nom de l'usuari.
- Escriu una prova per al component, simulant la funció
getUser
per retornar un nom d'usuari fictici.
Solució de l'exercici 1
// userService.js export const getUser = async () => { return { name: 'John Doe' }; }; // UserComponent.vue <template> <div> <p v-if="user">{{ user.name }}</p> <p v-else>Loading...</p> </div> </template> <script> import { getUser } from './userService'; export default { data() { return { user: null, }; }, async created() { this.user = await getUser(); }, }; </script> // UserComponent.test.js import { shallowMount } from '@vue/test-utils'; import UserComponent from './UserComponent'; import { getUser } from './userService'; jest.mock('./userService', () => ({ getUser: jest.fn(), })); describe('UserComponent', () => { it('mostra el nom de l\'usuari després de carregar', async () => { getUser.mockResolvedValue({ name: 'Jane Doe' }); const wrapper = shallowMount(UserComponent); await wrapper.vm.$nextTick(); expect(wrapper.text()).toContain('Jane Doe'); }); });
Resum
En aquest tema, hem après què és la simulació de dependències i per què és important en les proves unitàries. Hem vist com utilitzar jest.mock
per simular mòduls i hem treballat amb exemples pràctics per entendre millor el procés. Finalment, hem realitzat un exercici pràctic per reforçar els conceptes apresos.
En el proper tema, explorarem com realitzar proves de punta a punta amb Cypress, una eina poderosa per assegurar-nos que les nostres aplicacions 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