2015-09-21 62 views
0

下面是使用Zend的DB/Tablegateway功能:PHPUnit的 - 模擬回調函數

public function listAttestations($sSidx = null, $sSord = null, $iOffset = 0, $iLimit = 0) 
{ 
    try { 
     $resultSet = $this->tableGateway->select(
      function (Select $select) use ($sSidx, $sSord, $iOffset, $iLimit) { 
       if ($sSidx != null && $sSord != null) { 
        $select->order($sSidx.' '.$sSord); 
       } 
       $select->join(
        'f_travclient', 
        'syndic_client_id = f_travclient.travClient_id', 
        array('syndic' => 'nom') 
       ); 
       $select->offset($iOffset); 
       $select->limit($iLimit); 
      } 
     ); 
     return $resultSet; 
    } catch (\Exception $e) { 
     throw new \Exception($e); 
    } 
} 

我用PHPUnit的做單元測試。也許,我不知道如何使這個功能超越我以前的方法。我想這可能是功能性:

public function testListAttestations() 
{ 
    $resultSet = new ResultSet(); 

    $mockTableGateway = $this->getMock('Zend\Db\TableGateway\TableGateway', array('select'), array(), '', false); 

    $mockTableGateway->expects($this->once()) 
      ->method('select') 
      ->with() 
      ->will($this->returnValue($resultSet)); 

    $attestTable = new FMaiAttestationTable($mockTableGateway, $this->adapter, $this->sql); 

    $this->assertSame($resultSet, $attestTable->listAttestations('maiAttestation_id', 'ASC', 0, 30)); 
} 

但這不走的更遠:

function (Select $select) use ($sSidx, $sSord, $iOffset, $iLimit) { 

有人能幫助我嗎?謝謝。

回答

1

您可以獲取並使用給一個模擬的方法與returnCallback()任何參數:

$mockTableGateway->expects($this->once()) 
     ->method('select') 
     ->with() 
     ->will($this->returnCallback(function($function) use ($resultSet) { 
      // do something with the function, for example: 
      if(!is_callable($function)) { 
       return NULL; 
      } 
      call_user_func($function, new Select()); 
      return $resultSet; 
     })); 

不過,你可能要重新考慮你當前的代碼,因爲它是沒有必要寫嵌套這樣。你可以,例如,讓自己的Select一個實例,並用selectWith()

public function listAttestations($sSidx = null, $sSord = null, $iOffset = 0, $iLimit = 0) 
{ 
    try { 
     $select = new Select(); 
     if ($sSidx != null && $sSord != null) { 
      $select->order($sSidx.' '.$sSord); 
     } 
     $select->join(
      'f_travclient', 
      'syndic_client_id = f_travclient.travClient_id', 
      array('syndic' => 'nom') 
     ); 
     $select->offset($iOffset); 
     $select->limit($iLimit); 
     $resultSet = $this->tableGateway->selectWith($select); 
     return $resultSet; 
    } catch (\Exception $e) { 
     throw new \Exception($e); 
    } 
} 

使用它在這種情況下,現在可以測試,如果你的方法提出了Select在一起你想要的方式。你可以簡單地建立在您的測試另一個Select對象,你希望它是方式:

$resultSet = new ResultSet(); 

    $sSidx = 'maiAttestation_id'; 
    $sSord = 'ASC'; 
    $iOffset = 0; 
    $iLimit = 30; 

    $select = new Select(); 
    $select->order($sSidx.' '.$sSord); 
    $select->join(
     'f_travclient', 
     'syndic_client_id = f_travclient.travClient_id', 
     array('syndic' => 'nom') 
    ); 
    $select->offset($iOffset); 
    $select->limit($iLimit); 

    $mockTableGateway = $this->getMock('Zend\Db\TableGateway\TableGateway', 
     array('selectWith'), array(), '', false); 

    $mockTableGateway->expects($this->once()) 
     ->method('selectWith') 
     ->with($select) 
     ->will($this->returnValue($resultSet)); 

    $attestTable = new FMaiAttestationTable($mockTableGateway, $this->adapter, $this->sql); 

    $this->assertEquals($resultSet, $attestTable->listAttestations($sSidx, $sSord, $iOffset, $iLimit)); 

如果由模擬的方法selectWith使用Select對象看起來與您創建的任何不同,PHPUnit的將拋出一個錯誤你的測試。

+0

謝謝!它現在進入我的方法:) – Amelie