2015-09-21 9 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)); 

Если Select объект, используемый издевались метод selectWith выглядит не отличается от той, которую вы создали, PHPUnit будет сгенерировано сообщение об ошибке в ваш тест.

+0

Спасибо! Теперь он переходит в мой метод :) – Amelie

 Смежные вопросы

  • Нет связанных вопросов^_^