2015-05-13 3 views
1

Я пытаюсь высмеять действие «Удалить». Метод удаления находится внутри службы, поэтому я хотел бы высмеять службу, запрашиваемую внутри контроллера.Сопряжение с PHPUnit в Zend Framework 2

Это действие удаления:

public function deleteAction() 
{ 
    try { 
     $internId = $this->params()->fromRoute('id', 0); 
     $this->getServiceLocator()->get('internService')->removeIntern($internId); 
    } catch (Exception $e) { 
     $this->flashMessenger()->addErrorMessage($e->getMessage() . '<br>' . $e->getTraceAsString()); 
    } 
    return $this->redirect()->toRoute('intern/list'); 
} 

Это действие выполняется служба:

public function removeIntern($internId) 
{ 
    try { 
     $intern = $this->getIntern($internId); 
     $this->removeEntity($intern); 
     $this->flashMessenger()->addSuccessMessage("Intern has Successfully been Removed"); 
    } catch (Exception $e) { 

    } 
} 

Я хотел бы, чтобы дразнить этот метод внутри моего теста.

Я попытался это:

public function testDeleteAction() 
{ 
    $this->mockBjy(); 
    $this->mockZFC(); 

    $internMock = $this->getMockBuilder('Intern\Service\internService') 
         ->disableOriginalConstructor() 
         ->getMock(); 

$internMock->expects($this->any()) 
       ->method('removeIntern') 
       ->will($this->returnValue(null)); 

$serviceManager = $this->getApplicationServiceLocator(); 
$serviceManager->setAllowOverride(true); 
$serviceManager->setService('Intern\Service\internService', $internMock); 

    $this->dispatch('/intern/delete/86'); 
    $this->assertModuleName('intern'); 
    $this->assertControllerName('intern\controller\intern'); 
    $this->assertControllerClass('InternController'); 
    $this->assertActionName('delete'); 
    $this->assertMatchedRouteName('intern/delete'); 
} 

Я получаю ошибку в консоли при выполнении команды PHPUnit:

EntityManager # Remove() ожидает параметр 1, чтобы быть объектом объект, NULL дал.

Любая помощь будет оценена, спасибо заранее.

ответ

2

Похоже, вы неправильно настраиваете макет в своем сервис-менеджере. Вы получаете услугу с internService в своем действии. И в своем тесте вы помещаете свой макет в Intern\Service\internService.

Так что происходит, что вы используете реальный сервис, а не ваш макет. Измените свой вызов setService на следующее:

$serviceManager->setService('internService', $internMock); 
+0

Удивительный, даже не подумав, что spotting это. Спасибо за помощь. – eGlu

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