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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With