2012-02-24 28 views
2

我試圖測試一些我的php代碼,但與嘲笑對象失敗。我想模擬一個執行curl請求的函數,因爲它不應該在每次/測試時執行請求。嘲笑捲曲功能本身,工作。要求另一個班級在那裏嘲笑它,失敗。是否有可能從所需的類中嘲笑對象/函數?

以下是文件:

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,並返回給定的xml數據以供繼續使用。如何將$ stubCurl附加到$ this-> object?無論如何可能嗎?

謝謝你的時間。

回答

1

據我所知,你需要像這樣使用模擬和自動加載。由於您的cURL助手(即,您的class.request文件中的「require_once」)對代碼中的該調用有「硬」依賴性,因此PHP只會看到真正的cURL類並將使用該類。如果您使用自動加載,那麼PHP可以攔截調用來自動加載該類並替換模擬。

否則(這可能是一個更好的解決方案),你應該看看某種類型的IoC解決方案,因此對你的請求類不依賴於cURL類(即你沒有實例化cURL對象直接在請求類中)。有多種方法可以實現這一點。 DI或者更具體地說,依賴注入容器是PHP中的當前趨勢。您可能也想看看Service Locator。有一個good article by Martin Fowler描述所有這些模式和各種利弊。使用這些模式中的任何一種,您都可以更容易地將測試對象(嘲諷或存根等)替換爲待測代碼。

+0

這幫了我很多,非常感謝。 – adiebler 2012-02-24 17:05:56