2012-02-24 3 views
2

PHP 코드를 테스트하려고하는데 객체를 조롱합니다. 나는/테스트를 할 때마다 요청을해서는 안되기 때문에 컬 요청을하는 함수를 조롱하고 싶다. 컬 기능 자체를 조롱하면 효과가 있습니다. 그것을 다른 수업에 요구하고 조롱하는 것은 실패합니다.필요한 클래스에서 객체/함수를 조롱하는 것이 가능합니까?

helper.curl.php :

class Helper_Curl { 

    /* 
    ** __construct($callDomain) - construct new curl helper using set calldomain 
    */ 
    public function __construct($callDomain) { 
     $this->callDomain = $callDomain; 
    } 

    /* 
    ** sendPostArrayToApi($Array) - HTTP POST request to server 
    */ 
    public function sendPostArrayToApi($Array) { 

     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $this->callDomain); 
     // [... curl Settings ...] 
     $return = curl_exec($ch); 
     curl_close($ch); 
     return $return; 
    }  
    } 

class.request.php

require_once('helper.curl.php'); 

    class RequestClass { 

    function _set($data, $set_type='edit'){ 

     // [... some code ...] 

     $curl = new Helper_Curl('http://example.com'); 
     $xml = $curl->sendPostArrayToApi($InfoArray); 

     if($xml == "") { 
     return false; 
     } 
     // [... some more code ...] 
    }  
    } 

그리고 마지막으로 테스트 :

class ClassRequestTest extends PHPUnit_Framework_TestCase { 

    public function setUp() { 
     require_once('class.request.php'); 
    } 

    public function testSetRefund() { 

     $xml = '<?xml version="1.0" encoding="UTF-8"?> 
       <response> 
       <info-id>12345</info-id> 
       <transmit-id>315</transmit-id> 
       </response>'; 

     $stubCurl = $this->getMock('Helper_Curl'); 

     $stubCurl->expects($this->once()) 
       ->method('sendPostArrayToApi') 
       ->will($this->returnValue($xml)); 

     $this->object->_set($DataArray); 
    } 

    protected function tearDown() { 
     unset($this->object); 
    } 
    } 

여기

는 파일입니다 sendPostArrayToApi 기능 Helper_Curl 클래스의 n이 조롱되어야하고 _set 함수가 계속 진행될 수 있도록 주어진 xml 데이터를 반환해야합니다. $ this-> object에 $ stubCurl을 첨부하려면 어떻게합니까? 아무리해도 가능합니까?

감사합니다.

답변

1

나는 자동 로딩과 함께 조롱을 사용해야합니다. 코드에서 해당 호출에 도달하면 cURL 도우미 (class.request 파일의 "require_once")에 "엄격하게"의존하므로 PHP는 실제 cURL 클래스 만보고이를 사용합니다. 자동 로딩을 사용하면 PHP는 해당 클래스를 자동로드하도록 호출하고 모의 객체를 대체 할 수 있습니다.

그렇지 않으면 (더 나은 해결책이 될 수 있습니다) 어떤 종류의 IoC 솔루션을보아야합니다. 즉, cURL 클래스에 대한 종속성이 요청 클래스에서 하드 코딩되지 않습니다. 즉, cURL 개체를 인스턴스화하지 않습니다. 요청 클래스에서 직접). 이것을 달성하는 다양한 방법이 있습니다. DI 또는 더 구체적으로는 Dependency Injection Containers가 PHP의 현재 트렌드입니다. 대신 Service Locator을 보길 원할 수도 있습니다. good article by Martin Fowler은 이러한 모든 패턴과 다양한 장단점을 설명합니다. 이러한 패턴 중 하나를 사용하면 테스트 객체 (모조 또는 스텁 등)를 테스트중인 코드로 훨씬 더 쉽게 대체 할 수 있습니다.

+0

이것은 많은 도움이되었습니다. 정말 고마워요. – adiebler

관련 문제