Skip to Content

Terrain 14 — Tests & qualité

🔍 Renfort : Partie 14.

1. Test unitaire ⭐⭐

🕹️ Mission : tester PriceCalculator::total() avec un stub du provider de taxe.

✅ Solution

$rates = $this->createStub(TaxRateProvider::class); $rates->method('current')->willReturn(0.2); self::assertSame(1200, (new PriceCalculator($rates))->total(1000));

2. Exception attendue ⭐⭐

🕹️ Mission : vérifier qu’une méthode lève une InvalidArgumentException.

✅ Solution

$this->expectException(\InvalidArgumentException::class); $service->doSomethingInvalid();

3. Test fonctionnel ⭐⭐⭐

🕹️ Mission : GET /api/health renvoie du JSON en succès.

✅ Solution

$client = static::createClient(); $client->request('GET', '/api/health'); self::assertResponseIsSuccessful(); self::assertJson($client->getResponse()->getContent());

4. Authentifier en test ⭐⭐⭐

🕹️ Mission : tester qu’un admin accède à /admin.

✅ Solution

$user = static::getContainer()->get(UserRepository::class)->findOneBy(['email' => 'admin@booklab.test']); $client->loginUser($user); $client->request('GET', '/admin'); self::assertResponseIsSuccessful();

5. Test d’API + JWT ⭐⭐⭐⭐

🕹️ Mission : créer une réservation authentifiée et attendre 201.

✅ Solution

$token = $this->authToken(); static::createClient()->request('POST', '/api/bookings', ['auth_bearer' => $token, 'json' => [...]]); self::assertResponseStatusCodeSame(201);

6. Isolation ⭐⭐⭐

🕹️ Mission : les tests « passent seuls mais échouent ensemble ». Cause et solution ?

✅ Solution

Défaut d’isolation (base partagée). Solution : DAMADoctrineTestBundle (rollback par test) + fixtures, sans dépendre de l’ordre.

7. Factory Foundry ⭐⭐

🕹️ Mission : créer 3 réservations confirmées.

✅ Solution

BookingFactory::createMany(3, ['status' => BookingStatus::Confirmed]);

8. Data provider ⭐⭐⭐

🕹️ Mission : tester une logique sur plusieurs jeux d’entrées sans dupliquer.

✅ Solution

#[DataProvider('cases')] public function testX(int $in, int $out): void { self::assertSame($out, f($in)); } public static function cases(): array { return [[1, 2], [2, 4]]; }

9. PHPStan ⭐⭐

🕹️ Mission : PHPStan signale « call getEmail() on User|null ». Que faire ?

✅ Solution

Traiter le null : $user?->getEmail(), ou if ($user !== null), ou $user ?? throw ....

10. CI ⭐⭐⭐

🕹️ Mission : citez les étapes clés d’une CI Symfony.

✅ Solution

checkout → setup PHP → composer install → PHPStan → CS Fixer (dry-run) → migrations + phpunit → composer audit. Bloque le merge si rouge (protection de branche).


Terrain suivant : Perf & production.