2012-03-14 5 views
1

私は問題をチェックする必要があるので、モックオブジェクトのすべての呼び出しをリストする必要があります。 SimpleTestのドキュメントでこの機能について何も見つかりませんでした。 SPHP - SimpleTest - モックオブジェクトのメソッドへのすべての呼び出しを一覧表示します

はたぶん私のコードをテストするための別の方法があります:

class Clean_Collection_Tree_NestedArrayParser { 

    protected $path = array(); 
    protected $depth = -1; 

    /** @var Clean_Collection_Tree_MapTreeInterface */ 
    protected $tree; 

    public function setBasePath(array $path) { 
     $this->path = $path; 
    } 

    public function setTree(Clean_Collection_Tree_MapTreeInterface $tree) { 
     $this->tree = $tree; 
    } 

    public function parse($subject) { 
     $this->parseArray($subject); 
    } 

    public function parseArray(array $array) { 
     ++$this->depth; 
     foreach ($array as $key => $value) { 
      $this->path[$this->depth] = $key; 
      if (is_array($value)) { 
       $this->tree->put($this->path, new Clean_Collection_Map_Map()); 
       $this->parseArray($value); 
      } else 
       $this->tree->put($this->path, $value); 
     } 
     if (!empty($array)) 
      array_pop($this->path); 
     --$this->depth; 
    } 

} 

これは私がMapオブジェクトツリーを作成しようとしているから、ネストされた配列を待ってパーサーです。私はsetTree(Clean_Collection_Tree_MapTreeInterface $ツリー)実際のツリーを注入し、マップ・ツリー・インタフェースは、次のとおり

interface Clean_Collection_Tree_MapTreeInterface extends Clean_Collection_CollectionInterface { 

    public function putAll(array $array); 

    public function put(array $path, $value); 

    public function get(array $path); 

    public function getAll(array $pathes); 

    public function removeAll(array $pathes); 

    public function remove(array $path); 

    public function contains(array $path); 
} 

パーサーのみPUT(配列$パス、$値)方法を使用します。だから、すべてのputメソッドをリストすると、パーサで何がうまくいかなかったのかが分かります。 (。。SimpleMockは、私たちがインタフェースを実装し、私自身のモックオブジェクトを作成することができ、この機能を持っていない場合、私はそれによ)

答えて

2

問題はSimpleMockクラスの設計である:

protected function addCall($method, $args) { 

    if (! isset($this->call_counts[$method])) { 
     $this->call_counts[$method] = 0; 
    } 
    $this->call_counts[$method]++; 
} 

彼らは、 SimpleMockでプロパティを設定する代わりに、ロギング呼び出しプロパティのロガークラスを作成している必要があります...私たちはSimpleMockクラス拡張することで、回避策を作成することができます。

class LoggedMock extends SimpleMock { 

    protected $invokes = array(); 

    public function &invoke($method, $args) { 
     $this->invokes[] = array($method, $args); 
     return parent::invoke($method, $args); 
    } 

    public function getMockInvokes() { 
     return $this->invokes; 
    } 

} 

をベースモッククラスとして設定:

require_once __DIR__.'simpletest/autorun.php'; 
    SimpleTest::setMockBaseClass('LoggedMock'); 

その後、$ mockObj-> getMockInvokes()で呼び出しリストを取得できます。

編集:addCallを拡張することによって、我々は唯一の小文字形式ではなく、キャメルケースを記録できるように、我々は、理由メソッド名は小文字に変換されるinvokeメソッドの1行目に、addCallを拡張することができません。

interface Nike { 

    public function justDoIt(); 
} 

class NikeUser { 

    protected $nike; 

    public function setNike(Nike $nike) { 
     $this->nike = $nike; 
    } 

    public function doIt() { 
     $this->nike->justDoIt(); 
    } 

} 

Mock::generate('Nike', 'MockNike'); 

class NikeUserTest extends UnitTestCase { 

    public function testDoItButWeDontWantJustDoIt() { 
     $mockNike = new MockNike(); 

     $nikeUser = new NikeUser(); 
     $nikeUser->setNike($mockNike); 

     $expectedInvokes = array(); 

     $nikeUser->doIt(); 
     $expectedInvokes[] = array('justDoIt', array()); 
     $this->assertEqual($expectedInvokes, $mockNike->getMockInvokes()); 
    } 

} 
:私はデモ用のテストを作成し

(私は...小文字の変換が間違いであることを考えます)

関連する問題