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.
Le 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
un exemple de mise en œuvre SAI_CurlInterface
, puis de les appeler tous cURL fonctionne comme avant, mais que les méthodes de cette instance). La classe SAI_Curl
implémente cette interface, simplement en déléguant à friser. Maintenant, si vous voulez tester l' ClassUnderTest
vous pouvez donner un exemple d' SAI_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).
public function testGetData()
{
$curl = new SAI_CurlStub();
// Set up the CurlStub
$defaultOptions = array(
CURLOPT_URL => 'http://www.myserver.com'
);
$chromeOptions = array(
CURLOPT_URL => 'http://www.myserver.com',
CURLOPT_USERAGENT => 'Chrome/22.0.1207.1'
);
$safariOptions = array(
CURLOPT_URL => 'http://www.myserver.com',
CURLOPT_USERAGENT => 'Safari/537.1'
);
$curl->setResponse('fallback response');
$curl->setResponse('default response from myserver.com'
$defaultOptions);
$curl->setResponse('response for Chrome from myserver.com',
$chromeOptions);
$curl->setResponse('response for Safari from myserver.com',
$safariOptions);
$cut = new ClassUnderTest($curl);
// Insert assertions to check whether $cut handles the
// different responses correctly
...
}
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 l' SAI_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.
Au moment où 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 la stub.