2012-11-10 3 views
1

J'utilise une route dans Silex pour supprimer un objet de la base de données. Si un objet n'existe pas, une erreur 404 devrait être lancée. Cela fonctionne correctement dans le navigateur et la réponse est reçue en conséquence.Gestion des exceptions avec phpunit et Silex

C'est ma source:

$app->delete("/{entity}/{id}", function(\Silex\Application $app, HttpFoundation\Request $request, $entity, $id) { 
    // some prep code is here 
    $deleteObject = $this->em->getRepository($entityClass)->find($id); 
    if (empty($deleteObject)) 
     $app->abort(404, "$ucEntity with ID $id not found"); 
    // other code comes here... 
} 

Ceci est mon cas de test:

// deleting the same object again should not work 
$client->request("DELETE", "/ccrud/channel/$id"); 
$this->assertTrue($response->getStatusCode() == 404); 

Maintenant phpunit échoue avec l'erreur suivante: 1) CrudEntityTest :: TestDelete Symfony \ Component \ HttpKernel \ Exception \ HttpException: Canal avec ID 93 non trouvé

Je peux voir à partir du message que le 404 a été lancé, mais je ne peux pas tester l'objet de réponse comme prévu. Je sais qu'en théorie, je pourrais affirmer pour l'exception elle-même, mais ce n'est pas ce que je veux faire, je veux obtenir la réponse (comme un navigateur le ferait aussi bien) et tester le code d'état lui-même.

Quelqu'un at-il des idées pour l'atteindre ou s'il y a une meilleure façon de le tester?

Merci, Daniel

Répondre

2

Voilà comment cela se fait dans les tests de Silex lui-même (see here):

public function testErrorHandlerNotFoundNoDebug() 
{ 
    $app = new Application(); 
    $app['debug'] = false; 

    $request = Request::create('/foo'); 
    $response = $app->handle($request); 
    $this->assertContains('<title>Sorry, the page you are looking for could not be found.</title>', $response->getContent()); 
    $this->assertEquals(404, $response->getStatusCode()); 
}