Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

API-Integrationstests mit ApiTestCase

API-Integrationstests mit ApiTestCase

~16 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026

GENAU wie die Symfony-Schulung (Kapitel 44) WebTestCase für HTTP-Tests nutzte, bringt API Platform eine SPEZIALISIERTE ApiTestCase-Basisklasse MIT, die JSON-LD-spezifische Assertions ERGÄNZT.

Das Test-Paket prüfen

docker compose exec php composer require --dev api-platform/test

Meist BEREITS Teil der api-platform-Distribution – der Befehl installiert es NACHTRÄGLICH, falls NICHT VORHANDEN.

Den ersten Test schreiben

api/tests/ProjectResourceTest.php
<?php

declare(strict_types=1);

namespace App\Tests;

use ApiPlatform\Symfony\Bundle\Test\ApiTestCase;

final class ProjectResourceTest extends ApiTestCase
{
    public function testGetCollection(): void
    {
        $response = static::createClient()->request('GET', '/api/projects');

        self::assertResponseIsSuccessful();
        self::assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8');
        self::assertJsonContains(['@context' => '/api/contexts/Project']);
    }
}

assertJsonContains ist die WICHTIGSTE Ergänzung GEGENÜBER klassischen WebTestCase-Assertions – sie prüft, DASS die genannten Schlüssel/Werte im JSON VORKOMMEN, OHNE die GESAMTE Antwort exakt vergleichen zu müssen.

Gegen das JSON-Schema validieren

public function testGetCollectionMatchesSchema(): void
{
    static::createClient()->request('GET', '/api/projects');

    self::assertMatchesResourceCollectionJsonSchema(\App\Entity\Project::class);
}

assertMatchesResourceCollectionJsonSchema validiert die Antwort GEGEN das AUTOMATISCH aus #[ApiResource] ABGELEITETE JSON-Schema – ÄNDERT sich SPÄTER VERSEHENTLICH die Struktur (z. B. ein Feld VERGESSEN umzubenennen), SCHLÄGT DIESER Test SOFORT fehl.

Einen schreibenden Test

public function testCreateProject(): void
{
    static::createClient()->request('POST', '/api/projects', [
        'json' => ['name' => 'Testprojekt'],
        'headers' => ['Content-Type' => 'application/ld+json'],
    ]);

    self::assertResponseStatusCodeSame(201);
    self::assertJsonContains(['name' => 'Testprojekt']);
}

Achtung: OHNE Authentifizierung (Block 6) SCHLÄGT dieser Test AKTUELL mit 401 fehl – Kapitel 94 zeigt, WIE Testnutzer und Tokens für Tests bereitgestellt werden, DAMIT authentifizierte Endpunkte TESTBAR bleiben.

Die Tests ausführen

docker compose exec php bin/phpunit

Tipp: ApiTestCase ERBT von KernelTestCase (GENAU wie WebTestCase in der Symfony-Schulung) – static::createClient() bootet die GESAMTE Anwendung in einer isolierten Test-Umgebung, mit einer EIGENEN Datenbank-Verbindung (.env.test), die von der Entwicklungsdatenbank GETRENNT bleibt.