テスト コミュニティの一般的なコンセンサスは、private メソッドをテストしないことのようです。代わりに、それらを呼び出すパブリック メソッドをテストして、プライベート メソッドをテストする必要があります。しかし、何かが私には正しくありません。たとえば、次の方法を考えてみましょう。
/**
* Returns the base name of the output generator class. If the class is named
* Reno_OutputGenerator_HTML, this would return "HTML".
*
* @return string
*/
protected function getName()
{
$class = get_class($this);
$matches = array();
if (preg_match('/^Reno_OutputGenerator_(.+)$', $class, $matches))
{
return $matches[1];
}
else
{
throw new Reno_OutputGenerator_Exception('Class name must follow the format of Reno_OutputGenerator_<name>.');
}
}
この特定の関数は、私のクラスのいくつかの場所で使用されています。この関数のステートメントの両方のブランチをテストしたいと思いif
ます。つまり、パブリック関数ごとに、これら 2 つの状況に加えて、パブリック メソッド自体が行うすべてのことをテストする必要があります。
これは私にとって奇妙に感じるものです。getName()
特定の特定の条件が満たされたときに が例外をスローするかどうかをテストしている場合、それはプライベート メソッドの実装の詳細を知る必要があることを意味します。それを知る必要がある場合は、クラスを拡張し、メソッドをパブリックにして、そのようにテストしないのはなぜですか?
(ところで、なぜこのような奇妙なメソッドが存在するのか疑問に思っているなら、これは、このクラスのテンプレートファイルが保存されているディレクトリを自動的に把握するために使用されます)。