2015-11-30 8 views
9

Wie kann ich einen Webtestcase gegen eine API ausführen? In der Standardanleitung für Funktionstests wird nur der folgende Befehl angegeben:Symfony Web Testcase JSON

$client = static::createClient(); 
$crawler = $client->request('GET', '/some-url'); 

Die Crawler-Klasse ist ein DOM-Crawler. Ich habe die Referenz für die FrameworkBundle \ Client-Klasse überprüft und konnte keine Methode finden, mit der ich eine Anfrage stellen kann, die eine rohe Antwort zurückgibt. Auf diese Weise kann ich die Ausgabe json_decodieren und meine Tests durchführen.

Was kann ich verwenden, um dies zu erreichen?

Antwort

14

Nachdem Sie $client->request(...) aufrufen, können Sie $client->getResponse() tun, um Server-Antwort zu erhalten.

Sie können dann Statuscode durchsetzen und überprüfen seinen Inhalt, zum Beispiel:

$client->request('GET', '/my-url'); 
$response = $client->getResponse(); 
$this->assertSame(200, $response->getStatusCode()); 
$responseData = json_decode($response->getContent(), true); 
// etc... 
2

Das willdurand/rest-extra-bundle Bündel bietet additional helpers to test JSON. Um zu testen, Gleichheit gibt es bereits eine eingebaute in Behauptung für diesen Zweck:

use Bazinga\Bundle\RestExtraBundle\Test\WebTestCase as BazingaWebTestCase; 

// ... 

$client->request('GET', '/my-url'); 
$response = $client->getResponse(); 
$this->assertJsonResponse($response, Response::HTTP_OK); 
$this->assertJsonStringEqualsJsonString($expectedJson, $response); 

Beachten Sie, dass die assertJsonStringEqualsJsonString Behauptung verantwortlich die Normalisierung der beiden $expectedJson und $response Strings nehmen.

0

Es gibt eine PHPUnit \ Framework \ Assert :: assertJson() -Methode seit this commit Sie können auch "Content-Type" der Antwort testen.

$response = $client->getResponse(); 
$this->assertTrue($response->headers->contains('Content-Type', 'application/json')); 
$this->assertJson($response->getContent()); 
$responseData = json_decode($response->getContent(), true);