-
06-07-2019 - |
質問
PHPUnit を使用して抽象クラスの具象メソッドをテストするにはどうすればよいですか?
テストの一環として、ある種のオブジェクトを作成する必要があると予想します。ただし、これに対するベストプラクティスや、PHPUnit がこれを許可するかどうかはわかりません。
解決
抽象クラスの単体テストは、抽象クラスに具象メソッドを含めることができ、この具象メソッドをテストできるため、インターフェースのテストを意味するわけではありません。
一部のライブラリコードを記述するときに、アプリケーション層で拡張する予定の特定の基本クラスを持つことはそれほど珍しいことではありません。また、ライブラリコードがテストされていることを確認するには、抽象クラスの具体的なメソッドをUTする手段が必要です。
個人的に、私はPHPUnitを使用しており、この種のテストに役立つスタブとモックオブジェクトを持っています。
PHPUnitマニュアルからのストレート:
abstract class AbstractClass
{
public function concreteMethod()
{
return $this->abstractMethod();
}
public abstract function abstractMethod();
}
class AbstractClassTest extends PHPUnit_Framework_TestCase
{
public function testConcreteMethod()
{
$stub = $this->getMockForAbstractClass('AbstractClass');
$stub->expects($this->any())
->method('abstractMethod')
->will($this->returnValue(TRUE));
$this->assertTrue($stub->concreteMethod());
}
}
モックオブジェクトはいくつかのことを提供します:
- 抽象クラスを具体的に実装する必要はなく、代わりにスタブを使用できます
- 具象メソッドを呼び出して、それらが正しく実行されると断言することができます
- 具象メソッドが未実装(抽象)メソッドに依存している場合、PHPUnitメソッドwill()で戻り値をスタブ化できます
他のヒント
これはいい質問です。私もこれを探していました。
幸いにも、PHPUnitには既に があります。この場合のgetMockForAbstractClass()
メソッド、たとえば
protected function setUp()
{
$stub = $this->getMockForAbstractClass('Some_Abstract_Class');
$this->_object = $stub;
}
重要:
これにはPHPUnitが必要であることに注意してください> 3.5.4。以前のバージョンにはバグがありました。
最新バージョンにアップグレードするには:
sudo pear channel-update pear.phpunit.de
sudo pear upgrade phpunit/PHPUnit
PHP 7では、匿名クラスが追加されました。これにより、PHPUnit固有の機能に依存しない抽象クラスのテストを設定するための追加の手段が提供されます。
class AbstractClassTest extends \PHPUnit_Framework_TestCase
{
/**
* @var AbstractClass
*/
private $testedClass;
public function setUp()
{
$this->testedClass = new class extends AbstractClass {
protected function abstractMethod()
{
// Put a barebones implementation here
}
};
}
// Put your tests here
}
Eran、メソッドは機能するはずですが、実際のコードの前にテストを書く傾向に反します。
提案するのは、問題の抽象クラスの非抽象サブクラスの目的の機能に関するテストを作成し、抽象クラスと実装サブクラスの両方を作成して、最後にテストを実行することです。
テストでは、抽象クラスの定義済みメソッドを明らかにテストする必要がありますが、常にサブクラスを経由します。
ネルソンの答えは間違っています。
抽象クラスでは、すべてのメソッドが抽象である必要はありません。
実装するメソッドは、テストする必要があるものです。
できることは、単体テストファイルに偽のスタブクラスを作成し、抽象クラスを拡張し、機能をまったく使用せずに必要なものだけを実装し、テストすることです。
乾杯。
抽象クラスに既に実装されているメソッドの単体テストを実行するためだけに抽象クラスをサブクラス化したくない場合は、フレームワークで次のことが可能かどうかを確認してみてください。 モック 抽象クラス。