相信的私人/受保護的方法測試取決於在哪裏/如何被訪問,什麼正在測試。
如果我建立的公共代碼可重用庫,那麼這些類中的private和protected方法庫的測試用例中測試。這些測試確保較低級別的代碼可以正常工作,以便我可以對圖書館有信心。
現在,當我寫訪問這個庫業務應用程序,我不寫的庫對象的測試,因爲他們將在業務應用測試被嘲笑。圖書館測試表明圖書館工作,然後商業應用程序測試顯示該應用程序工作。
業務應用程序不會嘗試測試庫的私營/保護方法,因爲我認爲的代碼一個黑盒子,我不知道(類似於外部庫或Web服務)。然而,我仍然在業務應用程序的測試套件中測試業務應用程序的私有和受保護的方法,以確保方法/函數的行爲與他們應該的一樣。
作爲一個例子吧,假設以下業務類(非常簡短的表達思想,而不是函數):
<?php
class ACCOUNTS
{
protected GetEstimation()
{
...
return $CalculatedValue;
}
}
class CUSTOMER_ACCOUNT extends ACCOUNTS
{
protected GetEstimation()
{
$BaseEstimation = parent::GetEstimation();
...
return $NewCalculatedValue
}
}
class RESELLER_ACCOUNT extends ACCOUNTS
{
protected GetEstimation()
{
...
return $ResellerCalculatedValue; // Note: No call to parent
}
}
?>
在這個例子中有一些將要返回不同的值。 Protected功能被使用,因此可以被覆蓋,並且不必依賴父類功能。在這個例子中,我想測試所有這些類在使用時返回正確的值。
的基本賬戶類應該儘自己的計算,基於類值後返回的估計。作爲一個規則,我只是設置的值和測試的回報:
<?php
class ACCOUNTSTest extends PHPUnit_Framework_TestCase
{
protected $Accounts;
protected function setUp()
{
$this->Accounts = new ACCOUNTS();
}
public function testEstimationHome()
{
$this->Accounts->InternalValue1 = 1;
$this->Accounts->InternalValue2 = 10;
$this->Accounts->InternalValue3 = 100;
$this->assertEquals(523, $this->Accounts->GetEstimation(), 'Test Home Account with values 1, 10, 1000');
}
public function testEstimationHome2()
{
$this->Accounts->InternalValue1 = 5;
$this->Accounts->InternalValue2 = 2;
$this->Accounts->InternalValue3 = 10;
$this->assertEquals(253, $this->Accounts->GetEstimation(), 'Test Home Account with values 5, 2, 10');
}
protected function tearDown()
{
unset($this->Accounts);
}
}
?>
現在,這些測試將確保ACCOUNTS-> GetEstimation()是否正常工作。然後我會測試CUSTOMER_ACCOUNT,並進行類似的測試以確保該類正確計算。是的,如果基類發生變化,那麼我可能需要更新CUSTOMER_ACCOUNT中的測試,因爲ACCOUNTS-> GetEstimation()發生了變化,但是我還有一個額外的檢查,即基類仍然正確返回。
或者,我可以改變這個結構,使用依賴注入提供某些信息(賬戶),以確保如果父估計總是523,那麼這個類返回正確的價值觀。如果ACCOUNTS改變了返回的估計值,並且對這個類無關緊要(也許這個類只是增加了額外的值),然後我將我的測試隔離開來,不用擔心。
希望這個更新有助於說明我在說什麼。
我已投票結束主要是基於意見的。我認爲這會在沒有事實答案的情況下引發太多爭論。 –
有很多關於如何做錯事的問題(和答案)...... :) –
@DuncanJones好的。然後,如果我有這個疑問,我請你建議我該怎麼做。 – Geek