PHPUnit で抽象クラスの具象メソッドをテストするにはどうすればよいですか?
テストの一環として、ある種のオブジェクトを作成する必要があると思います。ただし、これに関するベスト プラクティスや、PHPUnit でこれが許可されているかどうかはわかりません。
PHPUnit で抽象クラスの具象メソッドをテストするにはどうすればよいですか?
テストの一環として、ある種のオブジェクトを作成する必要があると思います。ただし、これに関するベスト プラクティスや、PHPUnit でこれが許可されているかどうかはわかりません。
抽象クラスの単体テストは、必ずしもインターフェイスをテストすることを意味するわけではありません。抽象クラスは具体的なメソッドを持つことができ、この具体的なメソッドをテストできるからです。
ライブラリ コードを記述するときに、アプリケーション レイヤーで拡張する特定の基本クラスを使用することは、それほど珍しいことではありません。また、ライブラリ コードが確実にテストされるようにしたい場合は、抽象クラスの具象メソッドを UT する手段が必要です。
個人的に、私は PHPUnit を使用しています。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());
}
}
モック オブジェクトは、いくつかのことを提供します。
それは良い質問です。私もこれを探していました。
幸いなことに、PHPUnitgetMockForAbstractClass()
にはこの場合のメソッドが既に用意されています。
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
エラン、あなたのメソッドは機能するはずですが、実際のコードの前にテストを書く傾向に反します。
私が提案するのは、問題の抽象クラスの非抽象サブクラスの目的の機能についてテストを記述し、次に抽象クラスと実装サブクラスの両方を記述して、最後にテストを実行することです。
テストでは、抽象クラスの定義済みメソッドを明らかにテストする必要がありますが、常にサブクラスを介してテストする必要があります。
ネルソンの答えは間違っています。
抽象クラスでは、すべてのメソッドが抽象である必要はありません。
実装されたメソッドは、テストする必要があるものです。
あなたができることは、単体テストファイルに偽のスタブクラスを作成し、抽象クラスを拡張して、必要なものだけを実装し、機能をまったく持たずにテストすることです。
乾杯。
抽象クラスに既に実装されているメソッドに対して単体テストを実行するためだけに抽象クラスをサブクラス化したくない場合は、フレームワークで抽象クラスをモックできるかどうかを確認してみてください。