Advanced Typescript
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 (: number): string {
  if ( < 0) {
    throw new ('Le prix ne peut pas être négatif.');
  }
  // Utilise l'API Intl pour un formatage localisé
  return new Intl.('fr-FR', {
    : 'currency',
    : 'EUR',
  }).();
}

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()).