2

テストしたい DB アダプターを使用するモデルがあります。DB アダプターのコンストラクターはすべての DB 接続を処理するため、テスト中は避けたいと思います。そうしないと、db パス / db ユーザー名などが設定されていないというエラーが返されます。

disableOriginalConstructor()現在実行中のコードは以下のとおりです。コンストラクターの呼び出しを防ぐために使用していることがわかります。

問題は、で使用しようとすると、このエラーが発生すること$mysql_stubですwill():

PHPUnit_Framework_MockObject_Builder_InvocationMocker::will() に渡される引数 1 は、インターフェース PHPUnit_Framework_MockObject_Stub、指定された Mock_Pages_MySQL_Page_46612429 のインスタンスを実装する必要があり、185 行目で /Applications/MAMP/htdocs/lib/Pages/trunk/Tests/Unit/PageTest.php で呼び出され、定義されます

誰かがアドバイスできますか、正しい構文は何ですか?

class Page {

  public function getByUrl($url)
  {
      $db_page = $this->getDAOInterface();
      $db_page->getByUrl($url);
      $this->assign($db_page);
      return $this;
  }

}

class PageTest extends PHPUnit_Framework_TestCase
{
  public function testGetByUrl()
  {
      $test_url   = "foo-bar";
      $page_stub  = $this->getMock(
          'Pages_Model_Page', 
          array('getDAOInterface', 'assign')
      );

      $mysql_stub = $this->getMockBuilder('Pages_MySQL_Page')
                         ->setMethods(array('getByUrl'))
                         ->disableOriginalConstructor()
                         ->getMock();

      $mysql_stub->expects($this->once())
                ->method('getByUrl')
                ->with($this->equalTo($test_url));

      $page_stub->expects($this->once())
                ->method('getDAOInterface')
                ->with()
                ->will($mysql_stub);

      $page_stub->expects($this->once())
                ->method('assign')
                ->with($mysql_stub);

      $page_stub->geByUrl($test_url);
  }
}
4

1 に答える 1

5

さて、ついにそれの何が悪いのかを理解しました。エラーは私の側の脱落が原因でした。は、以下のように呼び出す必要があります。

$page_stub->expects($this->once())
          ->method('getDAOInterface')
          ->with()
          ->will($this->returnValue($mysql_stub));
于 2013-03-20T16:17:12.057 に答える