0

重複の可能性:
PHPUnitで保護されたメソッドをテストするためのベストプラクティス

class Footer
{
  private $_isEnabled;

  public function __construct(){
    $this->_isEnabled = true;
  }

  public function disable(){
    $this->_isEnabled = false;
  }  
}

falseに設定した後、無効化機能の単体テストを作成するときに、_isEanabledfalseであるかどうかをアサートしたいと思います。

しかし、どうすればアクセスできます$_isEnabledか?

これは私のテスト機能です:

public function testDisable(){
  $footer = new Footer();
  $footer->disable();
  $this->assertFalse($footer->_isEnable);
}
4

3 に答える 3

2

短い答え:

それはいけません。それがPRIVATEの意味です...

長い答え:

リフレクションを使用してそれを行うことができます:

http://php.net/manual/en/book.reflection.php

ただし、少し複雑で、失敗しやすい別のレイヤーが追加されるため、テストに最適な方法ではありません...

私はむしろゲッター関数を作成することを好みます:

public function getEnabled() {
   return $this->_isEnabled;
}

しかし、あなたがそれを単純なものとしてやっていなければ、あなたはそれを作りたくないと思います...しかし、選択肢を考えれば、あなたはそれを再考するかもしれません。

于 2012-07-01T18:52:52.023 に答える
1

アクセシブルな物件は公開されている必要がありますが、それは自明だと思います。ただし、パブリック変数へのアクセスと同様の方法で、保護されたプロパティとプライベートプロパティにアクセスできるように見えるコードに遭遇する可能性があります。

これは、マジックゲッターメソッドを使用して行われます。

class Footer
{
    private $_isEnabled;

    public function __get($propName)
    {
        if (!isset($this->{$propName}))
        {
            throw new Exception($propName.' is not set');
        }
        return $this->{$propName};
    }
}

この魔法のメソッドは、存在しないか公開されていないプロパティにアクセスしようとするたびに呼び出されます。要するに:

$instance->_isEnabled;//will work.

この方法は好きなように変更できるので、たとえば、アンダースコアはもう必要ありません...これでできることはたくさんあります。マニュアルページ
を参照してください

于 2012-07-01T19:16:22.127 に答える
1

これでポイントを獲得できるかどうかは疑問です。クラスは「代数的に」完全ではありません。Apublic function isEnabled()がありません。単体テストに状態に関する情報がない場合、他のクラスのクライアントもこの情報を見逃します。

プライベートなものの単体テストは、パブリックAPIで何も言うのに役立ちませんが、明らかなはずの内部操作をチェックします。

一般に、実装に依存する単体テストを持つことは悪いビジネスです。次に、再実装により、単体テストの保守も行われます。

于 2012-07-01T19:38:12.447 に答える