3

私は非常に単純なphpインターフェースを持っています:

interface HasFormattableNumber {
    function setNumber();
    function setFormat();
    function formatNumber();
}

次に、このインターフェイスを実装する多くのクラスがあります。残念ながら、これらのクラスは共通の祖先を持つことはできません (おそらく、これらのメソッドを 1 回だけ実装する抽象クラス)。クラスは基本的に次のようになります。

class A implements HasFormattableNumber {
    private $_number;
    private $_format;

    public function setNumber($n) {
        $this->_number = $n;
    }
    public function setFormat($f) {
        $this->_format = $f;
    }
    public function formatNumber() {
        return sprintf($this->_format, $this->_number);
    }
}

単体テストは次のようになります。

class ATest extends \PHPUnit_Framework_TestCase {
    public function testShouldFormatNumber() {
        $a = new A();
        $a->setNumber(123);
        $a->setFormat("xx-%d");
        $this->assertEquals("xx-123", $a->formatNumber());
    }
}

このテスト ケースをすべてのインターフェイス実装に何らかの方法で再利用することは可能ですか? testShouldFormatNumber() をコピーしてすべての単体テストに貼り付けられることはわかっていますが、できれば 1 か所にまとめておくことをお勧めします。

PHP Traits は何らかの形で役立ちますか? (ただし、まだphp 5.4を使用していません)

4

1 に答える 1

5

クラス A を初期化せず、すべての実装で定義するクラス変数を使用することを除いて、ATest のように見える basetest を作成できます。ファイルをディレクトリに配置するか、PHPUnit が実行しないように名前を付けます。次に、テストでそれを継承し、setUp() でクラス変数としてオブジェクトを作成できます。

于 2012-09-02T10:53:53.927 に答える