2017-07-14 13 views
0

私はPHPユニットテストを学んでいます。私は質問をした。メソッドからプロパティ値を設定する方法は?ここに私のコード例は次のとおりです。それは公共のだからPHPユニットテスト偽装メソッドのプロパティを設定

$mock->date = new \DateTime(); 

:上記のコードで

class Variables 
{ 

    public $date; 

    public function setDate(\DateTime $date) { 
     $this->date = $date; 
    } 

} 

class Process 
{ 
    public function process(Variables $var) { 
     if ($var->date->getTimeStamp() > 0) { 
      return 'success'; 
     } 

     return 'failed'; 
    } 
} 

class ProcessTest extends PHPUnit_Framework_TestCase 
{ 
    public function testProcess() 
    { 
     $mock = \Mockery::mock('Variables'); 
     $mock->date = new \DateTime(); 
     $procy = new Process(); 
     $actual = $procy->process($mock); 
     $this->assertEquals('success', $actual); 
    } 
} 

のように、私が知っている、私はしてプロパティdateを設定することができます。

プロパティdateがプライベートか保護されている場合はどうなりますか?どのように嘲笑から設定するには?このようなことをやろうとしましたが、エラーが発生しました。私の質問を説明し

$mock->shouldReceive('setDate')->once()->andSet('date', new \DateTime()); 

Sampleクラスは:

class Calculation { 

    protected $a; 
    protected $b; 
    protected $c; 

    public function __construct() { 
     ; 
    } 

    public function setA($a) { 
     $this->a = $a; 
    } 

    public function setB($b) { 
     $this->b = $b; 
    } 

    public function call() { 
     $this->c = (int) $this->a + (int) $this->b; 
    } 

    public function getC() { 
     return $this->c; 
    } 

} 

私はあなたのアドバイスを必要としています。

答えて

0

あなたはおそらく、Variablesにアクセサを追加する代わりにpublicプロパティにアクセスするのProcess::process()でそれを使用し、したがって、あなたはProcess::process()を呼び出すときアクセサが呼び出されるという期待を設定しなければならないでしょう:

$date = new \DateTime(); 

$variables = \Mockery::mock('Variables'); 

$variables->shouldReceive('getDate')->withNoArgs()->andReturn($date); 

$process = new Process(); 

$this->assertSame('success', $process->process($variables)); 

参考のため、参照:

+0

しかし私のクラスにはメソッド 'getDate'はありません。もし私が持っていれば、おそらく '$ mock-> shouldReceive( 'getDate') - > andReturn($ date);' – kelaskakap

+0

を実行するだけです。 'setDate()'が '$ date '、@kelaskakap。あなたのテストで重要でない場合は、それに対する期待を設定する必要はありません。 – localheinz

+0

はい私は 'setDate'メソッドからの期待は必要ありません。私はちょうど、知ってほしい、どのようにユニットテストでMockeryを使用して 'setDate'メソッドからプロパティ' date'(プライベートか保護されているか)を設定する方法です。私のクラスにはメソッド 'getDate'がありません。 – kelaskakap

関連する問題