Mocker Axios dans les tests Vue
Mise en place du mock d’Axios
Axios est largement utilisé pour les requêtes HTTP dans les applications Vue. Lors des tests unitaires, il est préférable de mocker Axios pour éviter les appels réseau réels et simuler différents scénarios de réponse.
Voici comment mocker Axios avec Vitest:
import { mount } from '@vue/test-utils'import { describe, it, expect, vi, beforeEach } from 'vitest'import axios from 'axios'import UserList from '@/components/UserList.vue'
// Mocker le module axios entiervi.mock('axios')
describe('UserList.vue', () => { beforeEach(() => { // Réinitialiser les mocks avant chaque test vi.clearAllMocks() })
it('fetches and displays users', async () => { // Configurer la réponse simulée d'axios const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]
// Simuler une réponse réussie axios.get.mockResolvedValue({ data: users })
const wrapper = mount(UserList)
// Attendre que toutes les promesses soient résolues await flushPromises()
// Vérifier que axios.get a été appelé avec la bonne URL expect(axios.get).toHaveBeenCalledWith('/api/users')
// Vérifier que les utilisateurs sont affichés correctement const userItems = wrapper.findAll('.user-item') expect(userItems.length).toBe(2) expect(userItems[0].text()).toContain('Alice') expect(userItems[1].text()).toContain('Bob') })
it('handles error when API call fails', async () => { // Simuler une erreur axios.get.mockRejectedValue(new Error('Network Error'))
const wrapper = mount(UserList)
// Attendre que toutes les promesses soient résolues (ou rejetées) await flushPromises()
// Vérifier que le message d'erreur s'affiche expect(wrapper.find('.error-message').exists()).toBe(true) expect(wrapper.text()).toContain('Erreur lors du chargement des utilisateurs') })})
Simuler différents codes de statut HTTP
Vous pouvez simuler différents codes de statut HTTP pour tester comment votre application gère les réponses:
it('handles 404 error correctly', async () => { // Créer une erreur Axios avec un code de statut 404 const error = new Error('Not Found') error.response = { status: 404, statusText: 'Not Found', data: { message: 'Resource not found' } }
axios.get.mockRejectedValue(error)
const wrapper = mount(UserList)
await flushPromises()
expect(wrapper.find('.not-found-message').exists()).toBe(true)})
Simuler une requête en cours
Pour tester les états de chargement, vous pouvez retarder la résolution de la promesse:
it('shows loading state while fetching data', async () => { // Créer une promesse que nous résoudrons manuellement plus tard let resolvePromise const promise = new Promise(resolve => { resolvePromise = resolve })
// Configurer axios.get pour retourner cette promesse axios.get.mockReturnValue(promise)
const wrapper = mount(UserList)
// À ce stade, la promesse n'est pas encore résolue expect(wrapper.find('.loading-spinner').exists()).toBe(true)
// Résoudre la promesse avec des données resolvePromise({ data: [] })
// Attendre que le composant réagisse await flushPromises()
// Le spinner de chargement devrait maintenant être masqué expect(wrapper.find('.loading-spinner').exists()).toBe(false)})
Mocker Axios pour des API spécifiques
Si vous avez créé des services API qui utilisent Axios, vous pouvez choisir de mocker ces services plutôt qu’Axios directement:
import { mount } from '@vue/test-utils'import { vi, expect, describe, it } from 'vitest'import UserService from '@/services/UserService'import UserDashboard from '@/components/UserDashboard.vue'
// Mocker le service API plutôt qu'Axiosvi.mock('@/services/UserService')
describe('UserDashboard.vue', () => { it('uses UserService to fetch data', async () => { UserService.getUsers.mockResolvedValue([ { id: 1, name: 'Alice' } ])
const wrapper = mount(UserDashboard)
await flushPromises()
expect(UserService.getUsers).toHaveBeenCalled() expect(wrapper.text()).toContain('Alice') })})