Tests
Tests unitaires
Tests avec vitest
Écrire un test
Pour installer vitest dans un projet, je vous invite à consulter la documentation.
Pour écrire un test nous allons suivre la règle du Arrange, Act, Assert.
- Arrange (Préparer) : On met en place tout le nécessaire pour le test. On définit les variables d'entrée, on prépare les mocks si besoin.
- Act (Agir) : On exécute la seule chose que l'on veut tester : on appelle notre fonction avec les variables préparées.
- Assert (Vérifier) : On utilise expect pour vérifier si le résultat de l'action est bien celui auquel on s'attendait.
Imaginons que nous ayons une fonction utilitaire très simple qui formate un prix.
export function formatPrice(price: number): string {
if (price < 0) {
throw new Error('Le prix ne peut pas être négatif.');
}
// Utilise l'API Intl pour un formatage localisé
return new Intl.NumberFormat('fr-FR', {
style: 'currency',
currency: 'EUR',
}).format(price);
}On peut alors créer notre fichier de test formatPrice.test.ts:
import { describe, it, expect } from 'vitest';
import { formatPrice } from '../src/formatPrice.js';
describe('formatPrice', () => {
it('should format a number to EUR', () => {
// 1. Arrange
const price = 42;
// 2. Act
const formatted = formatPrice(price);
// 3. Assert
// Intl ajoute un espace insécable, d'où le \xa0
expect(formatted).toBe('42,00\xa0€');
});
it('should format 0 to EUR', () => {
expect(formatPrice(0)).toBe('0,00\xa0€');
});
it('should format floating point numbers', () => {
expect(formatPrice(12.5)).toBe('12,50\xa0€');
});
it('should throw an error if the provided price is negative', () => {
// Pour tester les erreurs, on passe une fonction à expect
expect(() => formatPrice(-10)).toThrow('Le prix ne peut pas être négatif.');
});
});Exercice
La fonction calculateDiscount calcule le prix final d'un produit après une remise.
Elle est déjà écrite, et on vous garantit qu'elle fonctionne... pour l'instant.
Créez le fichier de test calculateDiscount.test.ts et écrivez une suite de tests complète pour cette fonction. Votre objectif est d'imaginer tous les cas possibles pour garantir qu'elle se comporte toujours comme prévu.
Pistes pour vos cas de test (it)
- Un cas simple (ex: 100€ avec 20% de remise).
- Un cas avec un prix à décimales.
- Un cas avec une remise de 0%.
- Un cas avec une remise de 100%.
- Que doit-il se passer si la remise est de 50.5% ?
- Que doit-il se passer si la remise est invalide (ex: -10% ou 110%) ? (Indice : .toThrow()).