comment l'unité de test curl appeler en php
Comment feriez-vous pour les tests unitaires d'un curl mise en œuvre?
public function get() {
$ch = curl_init($this->request->getUrl());
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
curl_close($ch);
if (!strstr($type, 'application/json')) {
throw new HttpResponseException('JSON response not found');
}
return new HttpResponse($code, $result);
}
J'ai besoin de tester le type de contenu retourné de sorte qu'il peut lever une exception.
Vous devez vous connecter pour publier un commentaire.
Comme thomasrutter suggéré de créer une classe abstraite de l'utilisation de la boucle fonctions.
Maintenant, vous pouvez tester à l'aide d'une maquette de la
HttpRequest
interface sans invoquer aucune des fonctions cURL.Modifier Fixe simple PHP parse error.
CurlRequest
dans une autre méthode appelée à partir du constructeur. Dans votre cas de test, le retard d'appeler le constructeur jusqu'à après que vous vous êtes moqué de la méthode pour retourner la simulation de la demande. Voir stackoverflow.com/a/5548229/285873 pour un exemple.HttpRequest
, avec les mêmes noms de méthode? Vous devriez poster une nouvelle question avec votre code et le message d'erreur.Ne pas utiliser curl directement mais par l'intermédiaire d'un wrapper comme la POIRE de HTTP_Request2. Avec elle, vous avez la possibilité d'échanger le curl pilote avec un faux pilote - idéal pour les tests unitaires.
Vous pouvez utiliser une fonction maquette de la bibliothèque. J'en ai fait une pour vous: php-mock-phpunit
Je suis tombé sur cette question quand j'étais en train de tester une classe à l'aide de cURL moi-même. J'ai pris David Harkness conseils à cœur, et créé une interface pour le roulage. Cependant, le stub/maquette fonctionnalités fournies par PHPUnit n'était pas suffisant dans mon cas, j'ai donc ajouté mon propre stub de mise en œuvre de l'interface et mettre tout ça sur GitHub. Et parce que cette question se montre assez tôt sur Google lors de la recherche de ce problème, je pensais que j'allais poster ici, alors que les autres pourraient être en mesure de sauver l'effort.
Elle est ici.
La référentiel du wiki contient une plutôt une documentation détaillée de la stub des capacités, mais ici, ils sont en court.
L'interface est un mappage 1:1 de PHP cURL fonctions, de sorte qu'il est devenu très facile de commencer à utiliser l'interface (tout simplement la main sur votre
ClassUnderTest
une instance de mise en œuvreSAI_CurlInterface
et ensuite appeler tous cURL fonctionne comme avant, mais que les méthodes de cette instance). La classeSAI_Curl
implémente cette interface, simplement en déléguant à friser. Maintenant, si vous voulez tester leClassUnderTest
vous pouvez donner un exemple deSAI_CurlStub
.Le stub principalement atténue le problème que PHPUnit de simulacres et les talons ne peut pas renvoyé des données factices selon l'ancien appels de fonction (mais c'est de cette façon cURL fonctionne réellement - vous définissez vos options et de la réponse, le code d'erreur et cURL-info dépendent de ces options). Voici donc un petit exemple, montrant les capacités de réponses (pour les codes d'erreur et boucle d'informations, voir le wiki).
Vous pouvez faire de votre réponse dépend d'une combinaison de cURL-options. Bien sûr, vous pouvez aller encore plus loin. Disons, par exemple, votre
ClassUnderTest
prend quelques données XML à partir d'un serveur et l'analyse (eh bien, vous devriez avoir deux classes distinctes pour ces tâches, mais supposons que ce pour notre exemple), et que vous voulez tester ce comportement. Vous pouvez télécharger la réponse XML manuellement, et vous avez votre test lire les données à partir du fichier et de le ranger dans la réponse. Alors vous savez exactement ce que les données sont là, et peut vérifier si c'est analysée correctement. Sinon, vous pouvez mettre en œuvre laSAI_CurlInterface
le chargement de toutes les réponses de votre système de fichiers tout de suite, mais la mise en œuvre est certainement un point de départ.À l'époque que je je suis en train d'écrire cette réponse, @SAI_CurlStub@ ne prend pas en charge cURL multi-lib fonctionnalités encore, mais j'ai l'intention de mettre en œuvre cela, aussi, à l'avenir.
J'espère que ce talon est d'aider toute personne qui veut l'unité de test cURL-classes dépendantes. N'hésitez pas à consulter et à utiliser les classes, ou de contribuer, bien sûr - c'est sur GitHub, après tout :). Aussi, je suis ouvert à toute critique constructive concernant la mise en œuvre et l'utilisation de l'interface et le talon.
Une approche consiste à remplacer l'interface que vous utilisez (dans ce cas, le curl_ fonctions) avec des feintes des versions d'eux-mêmes qui, de retour de certaines valeurs. Si vous utilisez l'une orientée objet library, ce serait plus facile parce que vous pouvez juste remplacer un objet factice qui a la même méthode pour les noms (et en effet, les cadres comme simpletest pouvez configurer objet factice méthodes facilement). Sinon, peut-être il ya quelques autres de la sorcellerie vous pouvez utiliser pour remplacer les fonctions intégrées avec des mannequins. Cette extension comprend override_function() qui ressemble à ce que vous auriez besoin, mais qui permettrait d'ajouter une autre dépendance.
Si vous voulez tester sans remplacement de la curl_ fonctions fictives versions, on dirait que vous aurez besoin de configurer un mannequin serveur qui sera de retour à un certain résultat, de sorte que vous pouvez tester la façon dont votre PHP, et son extension curl, poignées de résultat. Pour tester complètement, vous devez accéder à ce sur HTTP plutôt que, disons, un fichier local, parce que votre PHP dépend de l'existence d'un code de réponse HTTP, etc. Si vos tests nécessaire au bon fonctionnement d'un serveur HTTP.
D'ailleurs, PHP 5.4 comprendront son propre serveur web qui seraient utiles à cet effet. Sinon, vous pourriez mettre un script de test sur un serveur qui vous contrôle, ou de distribuer une simple configuration du serveur avec vos tests.
Si vous étiez réellement utiliser le serveur live pour vos tests, ce serait de moins en moins unité test et plus d'un test d'intégration, parce que vous tester à la fois PHP et le serveur, et l'intégration entre les deux. Vous aussi manquer d'être en mesure de tester sur la demande de la façon dont votre code poignées de certaines défaillances.
Dans votre unité de test, ont
request->getUrl()
retour de l'URI d'un fichier local que vous savez jeter l'exception.