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
}
}
我應該在我的測試中嘲笑函數嗎?我不確定哪些測試可能包含這個,因爲函數在代碼中使用。
希望能夠描述環境和代碼佈局。預先感謝您的幫助。
對不起,試圖縮短示例以顯示我們在PHP中工作的代碼中執行的操作,但不是在PHPUnit中執行。如果您查看FOO.class,則傳遞給Option1和_Option1的文本將簡單地返回給此示例。Option1使用我們擁有的PHP擴展,而_Option1僅僅是一個返回文本的虛擬對象,但是通過代碼驗證來確保所有文本都被相應地預處理。儘管如此,您對唯一可用的洞察力仍然有所幫助。讓我看看,並可能包含不同的文件。 – 2012-04-17 13:43:14
@StevenScott:但是你仍然需要在問題中加上瑕疵,否則 - 正如我寫的 - 沒有給出具體細節,你的解釋也不夠具體。定義是代碼,而不是談論代碼。 – hakre 2012-04-17 14:01:11
主要問題似乎是全局/單例測試。我們有那些正在使用的,這是我們正在嘗試發起的,因此是測試。有問題的函數在FOO.class中定義。此時返回簡單文本,其中一個來自我們創建的PHP擴展。擴展程序中的代碼處理傳遞的文本並返回修改後的文本。我們不想每次都初始化文本列表,這是單身人士的目的。 – 2012-04-17 16:48:59