Demander une réponse JSON avec le client HTTP de test Symfony

Publié le 24/11/2020 • Mis à jour le 24/11/2020


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

Dans ce bout de code, nous allons voir comment demander une réponse JSON avec le client HTTP de test Symfony. Si votre contrôleur retourne une réponse JSON, il n'y a rien à faire puisque la réponse sera toujours en JSON. Quand on utilise API Platform, le format retourné peut varier, il peut être JSON, JSON+LD, HTML... Dans ce cas, nous devons spécifier le type de format que nous désirons. Ça peut être fait en renseignant l'entête HTTP accept. L'astuce réside dans le fait que Symfony transforme les clés avec le motif HTTP_* en clé d'entête. Dans ce cas, l'entête qui est envoyé est accept: application/ld+json. Il y a une autre astuce avec API Platform ; on peut forcer le format désiré en spécifiant l'extension afin d'éviter de passer cet entête spécifique. Ce snippet permet de voir comment faire avec le WebTestCase de Symfony, car on pourrait utiliser le ApiTestCase fournit par API Platform. Celui-ci gère déjà tout ça pour nous et nous met à disposition quelques assertions supplémentaires spécifiques aux tests d'APIs.


<?php

declare(strict_types=1);

namespace App\Tests\Entity;

use ApiPlatform\Core\Bridge\Symfony\Bundle\Test\ApiTestCase;
use App\Tests\WebTestCase;

/**
 * For better tests use the ApiTestCase provided by API-Platform.
 *
 * @see https://api-platform.com/docs/distribution/testing/#writing-functional-tests
 * @see ApiTestCase
 */
final class ArticleTypeTest extends WebTestCase
{
    public function testArticleTypeCollection(): void
    {
        $client = self::createClient();
        $client->request('GET', '/api/articles.jsonld');
        self::assertResponseIsSuccessful();
        self::assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8');

        $client->request('GET', '/api/articles', [], [], ['HTTP_ACCEPT' => 'application/ld+json']);
        self::assertResponseIsSuccessful();
        self::assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8');
    }
}

 Plus sur Stackoverflow   Lire la doc  Plus sur le web  Snippet aléatoire