152

PHPUnit で抽象クラスの具象メソッドをテストするにはどうすればよいですか?

テストの一環として、ある種のオブジェクトを作成する必要があると思います。ただし、これに関するベスト プラクティスや、PHPUnit でこれが許可されているかどうかはわかりません。

4

6 に答える 6

252

抽象クラスの単体テストは、必ずしもインターフェイスをテストすることを意味するわけではありません。抽象クラスは具体的なメソッドを持つことができ、この具体的なメソッドをテストできるからです。

ライブラリ コードを記述するときに、アプリケーション レイヤーで拡張する特定の基本クラスを使用することは、それほど珍しいことではありません。また、ライブラリ コードが確実にテストされるようにしたい場合は、抽象クラスの具象メソッドを 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());
    }
}

モック オブジェクトは、いくつかのことを提供します。

  • 抽象クラスを具体的に実装する必要はなく、代わりにスタブを使用できます
  • 具体的なメソッドを呼び出して、それらが正しく実行されることをアサートできます
  • 具体的なメソッドが実装されていない (抽象) メソッドに依存している場合は、戻り値を will() PHPUnit メソッドでスタブすることができます
于 2010-02-10T23:35:03.847 に答える
39

それは良い質問です。私もこれを探していました。
幸いなことに、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
于 2011-02-13T23:46:54.910 に答える
1

エラン、あなたのメソッドは機能するはずですが、実際のコードの前にテストを書く傾向に反します。

私が提案するのは、問題の抽象クラスの非抽象サブクラスの目的の機能についてテストを記述し、次に抽象クラスと実装サブクラスの両方を記述して、最後にテストを実行することです。

テストでは、抽象クラスの定義済みメソッドを明らかにテストする必要がありますが、常にサブクラスを介してテストする必要があります。

于 2008-11-12T18:48:10.630 に答える
1

ネルソンの答えは間違っています。

抽象クラスでは、すべてのメソッドが抽象である必要はありません。

実装されたメソッドは、テストする必要があるものです。

あなたができることは、単体テストファイルに偽のスタブクラスを作成し、抽象クラスを拡張して、必要なものだけを実装し、機能をまったく持たずにテストすることです。

乾杯。

于 2009-09-23T15:19:58.793 に答える
0

抽象クラスに既に実装されているメソッドに対して単体テストを実行するためだけに抽象クラスをサブクラス化したくない場合は、フレームワークで抽象クラスをモックできるかどうかを確認してみてください。

于 2008-11-12T19:06:25.163 に答える