2013-02-27 9 views
10

オーバーロードされた__get($ index)メソッドを欺くことに問題があります。 クラスが嘲笑されるためのコードと、次のようにそれは消費テスト対象システム:PHPUnit:__get()を偽装すると、 "__get()は1つの引数をとる必要があります..."

<?php 
class ToBeMocked 
{ 
    protected $vars = array(); 

    public function __get($index) 
    { 
     if (isset($this->vars[$index])) { 
      return $this->vars[$index]; 
     } else { 
      return NULL; 
     } 
    } 
} 

class SUTclass 
{ 
    protected $mocky; 

    public function __construct(ToBeMocked $mocky) 
    { 
     $this->mocky = $mocky; 
    } 

    public function getSnack() 
    { 
     return $this->mocky->snack; 
    } 
} 

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

<?php  
class GetSnackTest extends PHPUnit_Framework_TestCase 
{ 
    protected $stub; 
    protected $sut; 

    public function setUp() 
    { 
     $mock = $this->getMockBuilder('ToBeMocked') 
        ->setMethods(array('__get') 
        ->getMock(); 

     $sut = new SUTclass($mock); 
    } 

    /** 
    * @test 
    */ 
    public function shouldReturnSnickers() 
    { 
     $this->mock->expects($this->once()) 
        ->method('__get') 
        ->will($this->returnValue('snickers'); 

     $this->assertEquals('snickers', $this->sut->getSnack()); 
    } 
} 

実際のコードは、しかし、少し複雑ですそれほど親クラスに「getSnacks()」を持っていません。しかし、この例で十分です。

Fatal error: Method Mock_ToBeMocked_12345672f::__get() must take exactly 1 argument in /usr/share/php/PHPUnit/Framework/MockObject/Generator.php(231) 

私は、私もテスト方法に到達できないデバッグする場合:

問題はPHPUnitでテストを実行するとき、私は、次のエラーを取得するです。それは模擬オブジェクトを設定する際に壊れているようです。

アイデア?

+0

さて、もう少しテストしました。問題は本当に嘲笑されたクラスの建設にあるようです。 - > setMethods(array( 'blabla'))で作成すると、彼はテストメソッドを取得します。 - > setMethods(array( '__ get'))を使うと、彼は壊れます。 – beToiba

+0

あなたは正しいです - 問題は、PHPモックオブジェクトが模擬を生成する方法と関係しています。 PHPUnit 4.0でこの問題が発生しています - どのバージョンを使用していますか? – HorusKol

+0

私はこれをPHPUnitのさまざまな組み合わせで再作成しようとしました。最新のバージョン(執筆時には4.8.2)からPHPUnit 3.5に戻ってMock Objectの依存関係があり、この方法で壊れるようなことはありません。環境 - Ubuntu 12.04.5 LTS上のPHP 5.5。元のポスターが、使用していたバージョンの組み合わせを覚えてこの質問に展開できない限り、私はこの質問をクローズすることをお勧めします。 – Benjamin

答えて

0

あなたはreturnCallbackの代わりreturnValueでそれを試みることができる:

$this->mock->expects($this->once()) 
    ->method('__get') 
    ->will($this->returnCallback(array($this, 'callbackMethod'))); 

その後、__getが呼び出されたパラメータを持つメソッドcallbackMethodを呼び出しますどの。

あなたのコールバックメソッドは次のようになります:

public function callbackMethod() 
{ 
    return 'snickers'; 
} 

参照: http://www.phpunit.de/manual/3.5/en/test-doubles.html#test-doubles.stubs.examples.StubTest5.php

+1

ヒントのおかげで、それは問題ではないようです。それは本当にモック作成ポイントにあるようです。 – beToiba

+0

素晴らしい、まさに私が必要なもの! –

-1

__get()は引数を取るので、あなたは1でモックを提供する必要があります。

/** 
* @test 
*/ 
public function shouldReturnSnickers() 
{ 
    $this->mock->expects($this->once()) 
       ->method('__get') 
       ->with($this->equalTo('snack')) 
       ->will($this->returnValue('snickers'); 

    $this->assertEquals('snickers', $this->sut->getSnack()); 
} 

with()メソッドは、PHPUnitで模擬メソッドの引数を設定します。詳細は、Test Doublesのセクションを参照してください。嘲笑マジックメソッド__getで

$this->mock -> expects($this -> once()) 
    -> method('__get') -> withAnyParameters() 
    -> will($this -> returnValue('snikers')); 
+0

'with()'呼び出しを含めることは私がこれを修正することを期待していますが、それは私のためではありません(PHPUnit 4.4)。それを与える前にこの答えを試しましたか?単にあなたがドキュメントを逆流させているのか、これがうまくいくのか知りたいのですか? –

+0

私はその時に3.7を使っていたと思います。これ(またはそのようなもの)は働いたが、私がこれを書いたときに私が参照していたものを見つけることができない。 いいえ、私はこのコードをテストしました。 – mAAdhaTTah

+0

乾杯。私は何かをやっている必要があります(PHP初心者のビットです) –

-1

withAnyParameters()メソッドは、これが正しい動作しますが、あなたを助けることができます。おそらく、別のオブジェクトから__getメソッドをもう1つ呼び出され、適切に擬似オブジェクトは呼び出されません。

関連する問題