2012-02-05 18 views
1

を子プロパティにアクセスできないように、これはユニットテスト(ショートバージョン)のための私の親クラスである:は(子オブジェクト内の親から継承されたメソッドを呼び出す)親クラスで

<?php 
class TestCaseAbstract extends PHPUnit_Framework_TestCase 
{ 
    protected $_rawPostData; 

    public function setUp() 
    { 
     // ... 
    } 

    /** 
    * 
    * @dataProvider provider 
    */ 
    public function testFoo($rawData) 
    { 
     // ... 
    } 

    public function provider() 
    { 
     return array(
      array(''), 
      array($this->_rawData), 
     ); 
    } 

    public function tearDown() 
    { 
     // ... 
    } 
} 

これは私の子クラス、実際の単位であります私はユニットテストケースの実行時に今

class FooTestCase extends TestCaseAbstract 
{ 
    public function setUp() 
    { 
     $this->_rawPostData = '<?xml version="1.0"?><request><bogus /></request>'; 

     parent::setUp(); 
    } 
} 

:テストケース

.phpunit --debug FooTestCase.php 

を私はこれを取得:

. 
Starting test 'FooTestCase::testFoo with data set #0 ('')'. 
. 
Starting test 'FooTestCase::testFoo with data set #1 (NULL)'. 
. 

ご覧のとおり、$ this - > _ rawDataというデータの2番目のユニットテストでは、NULLデータで実行されたと表示されています。私のコードで何が間違っていますか?テストメソッドが保護されたプロパティ$ this - > _ rawDataにアクセスできないようです。


私の継承モデルが台無しにならないことを願います。これは動作し、出力「こんにちは」それが必要として

<?php 

class ParentClass 
{ 
    protected $_property; 

    public function getProperty() 
    { 
     return $this->_property; 
    } 
} 

class ChildClass extends ParentClass 
{ 
    public function __construct() 
    { 
     $this->_property = 'Hello'; 
    } 
} 

$childClass = new ChildClass(); 
var_dump($childClass->getProperty()); 

:私は、私はそれがうまくいくと思うようちょうどPHPでの継承が動作することを確認する簡単なテストを行っています。私の単体テストでデータプロバイダがNULLを返す理由は何ですか?

答えて

3

これは、PHPUnitがデータプロバイダメソッドを処理する方法によって発生します。各プロバイダメソッドは、テストが開始される前に新しいテストケースインスタンスで1回実行されます。これは、正確なテストカウントを得るためです。

ただし、データプロバイダメソッドの前に呼び出されるではなく、です。この問題を回避するには、プロバイダメソッドが呼び出すことができる目的のデータを返すメソッドを追加します。この新しいメソッドを基本クラスで抽象クラスとして定義し、それを子クラスでオーバーライドします。また、基本クラスを抽象クラスにすることを忘れないでください。

abstract class TestCaseAbstract extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * @dataProvider provider 
    */ 
    public function testFoo($rawPostData) 
    { 
     // ... 
    } 

    public function provider() 
    { 
     return array(
      array(''), 
      array($this->_getRawPostData()), 
     ); 
    } 

    protected abstract function _getRawPostData(); 
} 

class FooTestCase extends TestCaseAbstract 
{ 
    protected function _getRawPostData() 
    { 
     return '<?xml version="1.0"?><request><bogus /></request>'; 
    } 
} 

アップデート:私はPHPUnitのは、データプロバイダメソッドの前にsetUp()を呼び出さないことを確認するために、小さなテストケースを書きました。

+0

ありがとうございました。私はそれを試してみましょう。これを試してほしいと私に数日を与えてください、それが動作する場合、私はあなたの答えを受け入れるでしょう。これは私の個人的なプロジェクトであり、私は仕事の週にそれに取り組むのに多くの時間がありません;)乾杯。 –

関連する問題