相信的私人/受保护的方法测试取决于在哪里/如何被访问,什么正在测试。
如果我建立的公共代码可重用库,那么这些类中的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