2012-04-16 37 views
0

PHP 5.3.10,PHPUnit的3.6.10參考對象PHPUnit中不工作,但不會在正常PHP執行

我打電話代碼中失敗初始化對象的測試,從而可以使用這樣的方法從中。問題是這是遺留代碼,並且這個函數在我們的應用程序中經常使用。它本身在PHP下工作,但不能在PHPUnit中運行。這些調用訪問我們爲我們的應用程序提供的PHP擴展。 一個非常簡單的例子來演示這個問題在下面。

類文件換到我們的PHP擴展(FOO)電話:

class FOO 
{ 
    $private $Bar; 

    pubilc function __construct() 
    { 
     $this->Bar = new OurPHPExtensionObject(); 
    } 

    public function Option1($Variable) 
    { 
     return $this->Bar->OurPHPExtensionMethod($Variable); 
    } 

    public function _Option1($Variable) 
    { 
     return $Variable; // Dummy to test that code is loaded 
    } 
} 
$Bar = new FOO(); 

這將創建對象並加載初始數據,因此只進行一次。其他調用使用它包括一個文件,然後包括這個類。當應用程序繼續運行時,唯一的初始化是第一次完成的,然後使用global關鍵字引用此對象來訪問它的方法。

Function.php例如:

require_once('FOO.class'); 
function CausesError($Parameter) 
{ 
    global $Bar; // Using $Bar defined from FOO.class 
    $ErrorCreated = $Bar->Option1($Parameter); // Call Option from Class 
} 

然後,單獨的程序簡單地inclde與require_once(),以確保只有1從任何地方加載的文件的實例的Function.php文件。

示例文件:

require_once('Function.php'); 
echo CausesError('Variable Text') . "\n"; 

這將導致錯誤:

Fatal error: Call to a member function Option1() on a non-object in ... 

作爲新PHPUnit的,並試圖儘量減少更改現有的代碼,直到我能得到到位的測試中,我需要一些關於如何處理這個問題的建議。大量的現有代碼通過簡單包含Function.php來調用該函數,然後調用該函數(CausesError)。我不知道如何得到這個返回數據。

然後,我的測試文件在每次測試之前都有一個setUp()方法。

class TEST_Function extends PHPUnit_Framework_TestCase 
{ 
    protected function setUp() 
    { 
     require_once('Function.php); 
     echo _Option1('Sample') . "\n"; // Works and ECHOs to show code loaded 
     echo Option1('Sample2') . "\n"; // Fails with the error 
    } 

    public function testFunctionOption1() 
    { 
     $this->assertEquals(Option1('English'), 'English'); // Error 
    } 
} 

我應該在我的測試中嘲笑函數嗎?我不確定哪些測試可能包含這個,因爲函數在代碼中使用。

希望能夠描述環境和代碼佈局。預先感謝您的幫助。

回答

0

通過你的問題,看完後我會假設你正在運行到一些其他的問題:

require_once('Function.php'); 

將確保該文件被加載一次。因此new FOO$Bar的分配只完成一次。由於該變量僅存在於單個測試功能的範圍內,因此只能在setUp()函數中使用。

但是,情況可能並非如此,因爲您尚未發佈_Option1()Option1()的定義,所以缺少更多具體信息來正確說出幕後發生的情況。

+0

對不起,試圖縮短示例以顯示我們在PHP中工作的代碼中執行的操作,但不是在PHPUnit中執行。如果您查看FOO.class,則傳遞給Option1和_Option1的文本將簡單地返回給此示例。Option1使用我們擁有的PHP擴展,而_Option1僅僅是一個返回文本的虛擬對象,但是通過代碼驗證來確保所有文本都被相應地預處理。儘管如此,您對唯一可用的洞察力仍然有所幫助。讓我看看,並可能包含不同的文件。 – 2012-04-17 13:43:14

+0

@StevenScott:但是你仍然需要在問題中加上瑕疵,否則 - 正如我寫的 - 沒有給出具體細節,你的解釋也不夠具體。定義是代碼,而不是談論代碼。 – hakre 2012-04-17 14:01:11

+0

主要問題似乎是全局/單例測試。我們有那些正在使用的,這是我們正在嘗試發起的,因此是測試。有問題的函數在FOO.class中定義。此時返回簡單文本,其中一個來自我們創建的PHP擴展。擴展程序中的代碼處理傳遞的文本並返回修改後的文本。我們不想每次都初始化文本列表,這是單身人士的目的。 – 2012-04-17 16:48:59

相關問題