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.