2012-09-18 7 views
5

Ich versuche, einige Tests für Silex mit phpunit schreiben.Silex & phpunit JSON Antwort

Ich habe eine Klasse Symfony \ Component \ BrowserKit \ Client, die ein Crawler-Objekt generiert.

Dieses Objekt erwartet, dass die Ergebnisse des Clients xhtml sind, aber meine API, die ich versuche zu testen, gibt JSON zurück und der Crawler lässt dies nicht zu.

Gibt es eine eingebaute Klasse in Silex oder phpunit, die mit JSON funktioniert oder muss ich meine eigene rollen?

Prost

Antwort

22

Es ist nichts Besonderes für mit json zu tun, aber Sie den Client ohne Verwendung der Crawler verwenden können. Einfach getResponse() auf dem Client rufen Sie die Antwort zu erhalten, wie folgt aus:

$client = $this->createClient(); 
$client->request('GET', '/'); 
$response = $client->getResponse(); 

$data = json_decode($response->getContent(), true); 
$this->assertSame(array('id' => 1, 'name' => 'igorw'), $data['users'][0]); 

Ich schlage vor, Sie auf dem Testfall diese Logik in eine Hilfsmethode bewegen und diese verwenden.

+0

Hervorragend, vielen Dank –

0

Für eine JSON Anfrage in Symfony 2 Browser-Kit Verwendung HTTP_ACCEPT statt ACCEPT und HTTP_CONTENT_TYPE statt CONTENT_TYPE senden. Hier ist ein Beispiel für das Senden von POST Anfrage mit einigen $data:

$client->request(
    $method = 'POST', 
    $uri, 
    $parameters = array(), 
    $files = array(), 
    $server = array(
     'HTTP_CONTENT_TYPE' => 'application/x-www-form-urlencoded; charset=UTF-8', // for sending urlencoded data 
     //or 'HTTP_CONTENT_TYPE' => 'application/json', // for sending JSON data 
     'HTTP_ACCEPT'  => 'application/json',  
    ), 
    $content = $data, 
    $changeHistory = true 
); 

$response = $client->getResponse(); 
$response_data = json_decode($response->getContent(), true);