Je travaille avec un framework interne où chaque exception est interceptée par un gestionnaire d'erreur et renvoyée dans une réponse d'erreur JSON appropriée, adaptée à une API RESTFul.comment faire PHPUnit cesser d'intercepter les exceptions?
Ensuite, j'ai une suite de tests, qui sont des tests API, qui testent principalement que l'API renvoie les bonnes réponses JSON avec les codes d'erreur attendus.
Pour chaque test, les variables globales sont modifiées (puis restaurées) pour émuler une requête HTTP différente. Je le fais de cette façon pour éviter la surcharge de faire des tests cURL (via Guzzle ou similaire), et provoquer dans l'environnement CLI, le code ne connaît pas l'URL du serveur.
<?php
// ... example, part of a base ApiTestCase class:
// Override globals (should be backed up by PHPUnit)
$_SERVER['REQUEST_METHOD'] = $request->method;
$_SERVER['QUERY_STRING'] = http_build_query($request->parameters);
$_SERVER['PATH_INFO'] = $request->path;
$_SERVER['REQUEST_URI'] = $request->path . ($_SERVER['QUERY_STRING'] ? '?' : '') . $_SERVER['QUERY_STRING'];
$_SERVER['REQUEST_TIME'] = time();
$_SERVER['REQUEST_TIME_FLOAT'] = microtime(true);
$_SERVER['HTTP_COOKIE'] = '';
// Set headers, cookies and parameters
foreach ($request->headers as $k => $v) {
$_SERVER['HTTP_' . strtoupper(str_replace('-', '_', trim($k)))] = $v;
}
if ($_SERVER['HTTP_COOKIE']) {
$GLOBALS['_COOKIE'] = http_parse_cookie($_SERVER['HTTP_COOKIE']);
} else {
$GLOBALS['_COOKIE'] = [];
}
$GLOBALS['_REQUEST'] = $request->parameters;
$responseBody = $app->start();
$response->httpCode = http_response_code();
$response->body = $responseBody ? @json_decode($responseBody) : null;
$response->headers = headers_list();
(je sais que le changement GLOBALS cette façon est pas agréable et le cadre ne doit pas compter sur GLOBALS directement, mais je dois encore traiter avec le code existant.)
Puis vient le problème ici: lorsque j'essaie de tester les réponses aux erreurs JSON: PHPUnit intercepte l'exception lancée (avant le gestionnaire que j'ai mentionné au début), donc le framework n'a aucune chance de le convertir en JSON et de retourner la bonne réponse.
J'ai essayé de trouver quelque chose dans le manuel PHPUnit pour désactiver le gestionnaire d'erreur PHPUnit sans aucune chance.
Que puis-je faire dans ce cas? Merci
Juste pour noter que la plus grande partie du code que vous avez cité ressemble probablement à une fonction 'setup()' dans votre classe de test phpUnit. De plus, notez que phpUnit a la capacité intégrée de restaurer les globals à leur état vierge après chaque test. Vous pouvez utiliser cela plutôt que de réinventer la roue. – Simba
le code est juste un exemple, mais c'est vrai que PHPunit fait des sauvegardes globales – itsjavi
@mjolnic Salut mec, j'ai le même problème ici. Avez-vous trouvé une résolution appropriée? – dKen