2011-03-02 13 views
3

私はモックしたいインターフェイスを持っており、そのメソッドの動作を模擬しています。PHPUnitを嘲笑するときのコールバックの参照渡し

私は非常に簡単に行動を模倣するコールバックを作成しました。

このテストは、このインターフェイスに基づいた新しいオブジェクトを作成した場合に渡されますが、インターフェイスをモックしたいと思います。

mocked setUpメソッドが正常に呼び出され、コールバックでgetVar( 'testing')を呼び出すと値が返されます。しかし、私のアサーションは失敗します。なぜなら、その値は利用できないからです。

これはPHPUnitではできないようですね。私がばかげていない限り。

コードフローの簡単な説明。 "getVar"のコードは、追加されたプラグインの "setUp"を呼び出すメソッドを呼び出します。 "setUp"を呼び出すと、 "$ this"を渡します。これは私が参照渡しされることを期待しているもので、実際のオブジェクトで動作するものです。詳細については

class DefaultRendererTest extends \PHPUnit_Framework_TestCase 
{ 

    public function testSetGetVar() 
    { 
     $theme = $this->getMock('ThemeInterface'); 

     $plugin = $this->getMock('PluginInterface'); 
     $plugin->expects($this->once()) 
      ->method('setUp') 
      ->will($this->returnCallback(function($r){ 

       $r->setVar('testing', "fooBar"); 

     })); 

     $renderer = new DefaultRenderer($theme, null); 
     $renderer->addPlugin($plugin); 
     $this->assertEquals('fooBar',$renderer->getVar('testing')); 
    } 
} 

ここインターフェースがあり、DefaultRendererはRendererInterface

interface PluginInterface 
{ 
    function setUp(RendererInterface $renderer); 
} 
+0

私にとって完全に正しいと思われます。 $ rと$ rendererが実際に同じオブジェクトへの参照であるかどうかチェックしましたか?しかし、私は彼らがしてはならない理由は見ません。たぶんsetVar()やgetVar()にバグがありますか? – tobyS

答えて

4

OKを実装して、関心の外に、私は問題を突き止め。 PHPUnitは、実際の呼び出しが行われる前にパラメータを自動的にクローンするようです。私はこれに本当の理由は見当たりませんが、おそらく1つあります。 Framework/MockObject/Invocation/Static.phpを見てみると、これを避ける方法は1つしかありません(組み込みの模擬コードに基づいています)。メソッドをDefaultRendererに実装します。

この動作や模擬オブジェクトライブラリについては、IRCまたはPHPUnitのメーリングリストにお尋ねすることをお勧めします。

+3

セバスチャンは、これが正しい動作であるかどうかは確かではありませんが、どちらか一方の方法で最終決定を下したわけではありません。クローニングが間違った動作であるというフィードバックを提供するのに役立ちます。 –

+1

_(関連)_(Davidsに正しいコメントを追加する):私は同じ問題/質問を持っていて、それについてセバスチャンに尋ねました:http://stackoverflow.com/questions/4702132/problem-with-returncallback-of- phpunit-mocks/4711782#4711782 – edorian

関連する問題