4

私はPHPUnitとTDDから始めたばかりです。

とりわけ、私はこの質問に本当に答えることができません:これは良いテストですか?私は実際に自分のコードまたはすでにテストされたもの(つまり、フレームワークまたはPHP自体)をテストしていますか?

ちょっとした例ですが、これはテスト対象です。

class DateMax extends Constraint
{
    /**
     * @var string
     */
    public $limit;

    /**
     * @var string
     */
    private $invalidLimit = 'Option "limit" should be a valid date/time string.';

    public function __construct($options = null)
    {
        parent::__construct($options);

        if(false === strtotime($this->limit)) {
            throw new InvalidOptionsException($this->invalidLimit, ['limit']);
        }
    }
}

InvalidOptionsException無効な「制限」オプションが渡された場合に予想されることをテストしたい。それ以外の場合$constraint->limitは正しい値を保持します。

/**
 * @dataProvider getInvalidLimits
 * @expectedException InvalidOptionsException
 */
public function testInvalidLimits($testLimit)
{
    new DateMax($testLimit);
}

/**
 * @dataProvider getValidLimits
 */
public function testValidLimits($testLimit)
{
    $constraint = new DateMax($testLimit);
    $this->assertEquals($testLimit, $constraint->limit);
}

/**
 * @return array[]
 */
public function getInvalidLimits()
{
    return array(array('invalid specification'), array('tomorr'));
}

/**
 * @return array[]
 */
public function getValidLimits()
{
    return array(array('now'), array('+1 day'),array('last Monday'));
}

質問は、これは意味がありますか、それともフレームワーク/ PHP自体をテストしていますか?

4

1 に答える 1

2

もちろん、それは理にかなっています。なぜなら、Constraintクラスのコンストラクターをオーバーライドし、その中の何かを壊す可能性があるからです。したがって、コンストラクタロジックに基づいて、基本的に2つのことをテストする必要があります。

  1. 同じオプションを使用して親のコンストラクターを1回だけ呼び出すかどうかを確認します(この目的でモックを使用できます。適切な制限値を設定する必要はありません。これはConstraintクラスでテストする必要があるためです)。
  2. 制限の値が間違っている場合(例:null)に適切な例外がスローされたかどうかを確認します

編集:最初のテストが役立ついくつかのユースケースはこれかもしれません:

ある時点で、DateMaxコンストラクターを次のように拡張したいとします。

public function __construct($options = null)
{
    $this->optionsWithDecrementedValues = $this->doWeirdThings($options);

    parent::__construct($options);

    if(false === strtotime($this->limit)) {
        throw new InvalidOptionsException($this->invalidLimit, ['limit']);
    }
}

しかし、たとえば、メソッド「doWeirdThings」が引数として参照をとることに気づかなかったでしょう。したがって、実際には、予期していなかった$ options値が変更されますが、最初のテストは失敗するため、見逃すことはありません。

于 2012-09-21T18:56:38.913 に答える