質問

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

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

提案するのは、問題の抽象クラスの非抽象サブクラスの目的の機能に関するテストを作成し、抽象クラスと実装サブクラスの両方を作成して、最後にテストを実行することです。

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

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

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

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

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

乾杯。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top