2013-11-17 3 views
1

Я довольно новичок в phpunit и насмешливо, и я хочу протестировать Listener в моем проекте symfony2, что является слушателем исключения ядра.PHPunit mock - вызов функции в возвращаемом макете

Это класс я хочу, чтобы тест:

public function onKernelException(GetResponseForExceptionEvent $event) 
{ 
    $code = $event->getException()->getCode(); 
    if($code == 403) 
    { 
     $request = $event->getRequest(); 
     $session = $request->getSession(); 
     $session->getFlashBag()->add('notice', 'message'); 
     $session->set('hardRedirect', $request->getUri()); 
    } 
} 

И первый я просто хотел проверить, так что ничего не происходит, если код 404, это испытание я писал:

public function testWrongStatusCode() 
{ 
    $exceptionMock = $this->getMock('Exception') 
         ->expects($this->once()) 
         ->method('getCode') 
         ->will($this->returnValue('404')); 

    $eventMock = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent') 
         ->disableOriginalConstructor() 
         ->getMock(); 
    $eventMock->expects($this->once()) 
       ->method('getException') 
       ->will($this->returnValue($exceptionMock)); 

//here call the listener 
} 

, но PHPunit говорит, что функция getCode никогда не вызывалась.

ответ

2

Вы не можете использовать «цепочку», как вы пробовали. Причина в том, что методы getMock и will возвращают разные объекты. Вот почему вы теряете свой настоящий макет. Попробуйте вместо этого:

$exceptionMock = $this->getMock('\Exception'); 
$exceptionMock->expects($this->once()) 
    ->method('getCode') 
    ->will($this->returnValue('404')); 

Редактировать

Ok. Проблема в том, что вы не можете макет getCode, потому что это final, и невозможно издеваться над final и private методами с PHPUnit.

Мое предложение: просто подготовить объект исключения вы хотите, и передать его в качестве возвращаемого значения для издеваться события:

$exception = new \Exception("", 404); 
(...) 
$eventMock->expects($this->once()) 
    ->method('getException') 
    ->will($this->returnValue($exception)); 
+0

На самом деле я пробовал это, прежде чем я отправил и не работал. Аналогичная ошибка. Метод должен был называться 1 раз, фактически называемый 0 раз. Я также var_exported класс $ event-> getException(), и это был класс Mock_Exception. – ghostika

+0

Хорошо, я отредактировал свой ответ – Cyprian

+0

Спасибо, это было решение. Я постараюсь не забывать об этом в будущем. – ghostika

-1

Вы можете использовать mockery library с PHPUnit, который является отличным инструментом и делает жизнь проще.

$exceptionMock = \Mockery::mock('GetResponseForExceptionEvent'); 
$exceptionMock->shouldReceive('getException->getCode')->andReturn('404'); 

Ознакомьтесь с документацией для более ... и я надеюсь, что вам понравится.

+0

Это часть вообще, в Symfony $ this-> getMock использует издевательство. И если вы читаете предыдущий ответ, вы не можете издеваться над общим исключением, то, что проблема была здесь, или, по крайней мере, функцией getCode. – ghostika

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