Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to unit test curl call in php

Tags:

php

curl

phpunit

How would you go about unit testing a curl implementation?

  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);   } 

I need to test the content type returned so that it can throw an exception.

like image 954
Yader Hernandez Avatar asked Oct 27 '11 03:10

Yader Hernandez


1 Answers

As thomasrutter suggested, create a class to abstract the usage of the cURL functions.

interface HttpRequest {     public function setOption($name, $value);     public function execute();     public function getInfo($name);     public function close(); }  class CurlRequest implements HttpRequest {     private $handle = null;      public function __construct($url) {         $this->handle = curl_init($url);     }      public function setOption($name, $value) {         curl_setopt($this->handle, $name, $value);     }      public function execute() {         return curl_exec($this->handle);     }      public function getInfo($name) {         return curl_getinfo($this->handle, $name);     }      public function close() {         curl_close($this->handle);     } } 

Now you can test using a mock of the HttpRequest interface without invoking any of the cURL functions.

public function testGetThrowsWhenContentTypeIsNotJson() {     $http = $this->getMock('HttpRequest');     $http->expects($this->any())          ->method('getInfo')          ->will($this->returnValue('not JSON'));     $this->setExpectedException('HttpResponseException');     // create class under test using $http instead of a real CurlRequest     $fixture = new ClassUnderTest($http);     $fixture->get(); } 

Edit Fixed simple PHP parse error.

like image 140
David Harkness Avatar answered Sep 22 '22 08:09

David Harkness