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 関数が使用されており、親クラスの機能に依存する必要はありません。この例では、これらすべてのクラスが使用時に適切な値を返すことをテストしたいと思います。
基本的な ACCOUNTS クラスは、クラスの値に基づいて計算を行った後、Estimation を返す必要があります。原則として、値を設定して戻り値をテストするだけです。
<?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 をテストし、同様のテストを行って、クラスが正しく計算されていることを確認します。
はい、基本クラスが変更された場合、ACCOUNTS->GetEstimation() が変更されたため、CUSTOMER_ACCOUNT のテストを更新する必要があるかもしれませんが、基本クラスがまだ正しく返されていることを確認する追加のチェックもあります。
別の方法として、この構造を変更し、依存性注入を使用して特定の情報 (ACCOUNTS) を提供し、親の推定値が常に 523 である場合に、このクラスが適切な値を返すようにすることもできます。ACCOUNTS が返された推定値を変更しても、このクラスには問題がない場合 (このクラスは値を追加しているだけかもしれません)、テストを分離して心配する必要はありません。
このアップデートが、私が言っていることを説明するのに役立つことを願っています.